RS485串口通信
//-----------------------函数声明,变量定义--------------------------------------------------------
#include
sbit RE_DE=P1^0;
#define COUNT 10 // 定义接收缓冲区大小
#define ADD 5 //定义设备地址
unsigned char buffer[COUNT]; //定义接收缓冲区
unsigned char point; //定义接收数据个数指示变量
void UART_init(); //串口初始化函数
void COM_send(void); //串口接收函数
unsigned char CLU_checkdata(void);//计算校验位函数
//--------------------------------------------------------------------------------------------------
// 函数名称: UART_init()串口初始化函数
// 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
// 串口接收中断允许,发送中断禁止
//--------------------------------------------------------------------------------------------------
void UART_init()
{
//初始化串行口和波特率发生器
SCON =0x0F0; //选择串口工作方式为3,打开接收允许
TMOD =0x21; //定时器1工作在方式2,定时器0工作在方式1
TH1 =0xfd; //实现波特率9600(系统时钟11.0592MHZ)
TL1 =0xfd; //实现波特率9600(系统时钟11.0592MHZ)
TR1 =1; //启动定时器T1
ET1 =0;
ES=1; //允许串行口中断
PS=1; //设计串行口中断优先级
EA =1; //单片机中断允许
SM2=1; //设备处于地址监听状态
}
//--------------------------------------------------------------------------------------------------
// 函数名称: com_interrup()串口接收中断处理函数
// 函数功能: 接收包括起始位0xFE,地址位和终止位0xEF在内的十位数据到数据缓冲区,
// 地址不匹配,则接收到的是无效数字,不写到接收缓冲区
//--------------------------------------------------------------------------------------------------
com_interrupt(void) interrupt 4 using 3
{
unsigned char RECEIVR_buffer;
if(RI)
{ //处理接收中断
RI=0; //清除中断标志位
RECEIVR_buffer=SBUF; //接收串口数据
if(point==0) //如果还没有接收到起始位
{
if(RECEIVR_buffer==0xFE) //判断是否起始标志位
buffer[point++]=RECEIVR_buffer;//起始正确,接收起始位
else
point=0; //不是,继续等待起始位
}
else if(point==1) //是否地址位
{
if(RECEIVR_buffer==ADD) //判断地址是否匹配
buffer[point++]=RECEIVR_buffer;//地址匹配,接收开始接收
else
point=0; //不匹配,继续下一个起始位
}
else if(point>0&&point<10) //判断是否接收够十位数据
buffer[point++]=RECEIVR_buffer; //不够,把接收到的数据放入接收缓存区
else point=0; //缓冲区已满,清除缓存区内数据重新接收
}
if(TI) //串口发送中断
{
TI=0; //清除发送中断
}
}
//--------------------------------------------------------------------------------------------------
// 函数名称: COM_send()串口发送函数
// 函数功能: 把数据缓冲区的十位数据发送出去
//--------------------------------------------------------------------------------------------------
void COM_send(void)
{
RE_DE=1; //设置MAX483进入发送状态
for(point=0;point<=10,TI=1;point++) //连续发送十位数据
//把缓存区的数据都发送到串口
{
SBUF=buffer[point];
TI=0;
}
RE_DE=0; //设置MAX483进入接收状态
}
//--------------------------------------------------------------------------------------------------
// 函数名称: 主函数
// 函数功能: 调度个子函数,完成通信过程
//--------------------------------------------------------------------------------------------------
void main(void)
{
UART_init(); //初始化串口
do
{
}
while(point!=10); //判断数据是否接收完成
COM_send(); //地址匹配,数据完整接收,调用发送程序通知主机
SM2=0; //设置为点对点通信状态
}
#include
sbit RE_DE=P1^0;
#define COUNT 10 // 定义接收缓冲区大小
#define ADD 5 //定义设备地址
unsigned char buffer[COUNT]; //定义接收缓冲区
unsigned char point; //定义接收数据个数指示变量
void UART_init(); //串口初始化函数
void COM_send(void); //串口接收函数
unsigned char CLU_checkdata(void);//计算校验位函数
//--------------------------------------------------------------------------------------------------
// 函数名称: UART_init()串口初始化函数
// 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
// 串口接收中断允许,发送中断禁止
//--------------------------------------------------------------------------------------------------
void UART_init()
{
//初始化串行口和波特率发生器
SCON =0x0F0; //选择串口工作方式为3,打开接收允许
TMOD =0x21; //定时器1工作在方式2,定时器0工作在方式1
TH1 =0xfd; //实现波特率9600(系统时钟11.0592MHZ)
TL1 =0xfd; //实现波特率9600(系统时钟11.0592MHZ)
TR1 =1; //启动定时器T1
ET1 =0;
ES=1; //允许串行口中断
PS=1; //设计串行口中断优先级
EA =1; //单片机中断允许
SM2=1; //设备处于地址监听状态
}
//--------------------------------------------------------------------------------------------------
// 函数名称: com_interrup()串口接收中断处理函数
// 函数功能: 接收包括起始位0xFE,地址位和终止位0xEF在内的十位数据到数据缓冲区,
// 地址不匹配,则接收到的是无效数字,不写到接收缓冲区
//--------------------------------------------------------------------------------------------------
com_interrupt(void) interrupt 4 using 3
{
unsigned char RECEIVR_buffer;
if(RI)
{ //处理接收中断
RI=0; //清除中断标志位
RECEIVR_buffer=SBUF; //接收串口数据
if(point==0) //如果还没有接收到起始位
{
if(RECEIVR_buffer==0xFE) //判断是否起始标志位
buffer[point++]=RECEIVR_buffer;//起始正确,接收起始位
else
point=0; //不是,继续等待起始位
}
else if(point==1) //是否地址位
{
if(RECEIVR_buffer==ADD) //判断地址是否匹配
buffer[point++]=RECEIVR_buffer;//地址匹配,接收开始接收
else
point=0; //不匹配,继续下一个起始位
}
else if(point>0&&point<10) //判断是否接收够十位数据
buffer[point++]=RECEIVR_buffer; //不够,把接收到的数据放入接收缓存区
else point=0; //缓冲区已满,清除缓存区内数据重新接收
}
if(TI) //串口发送中断
{
TI=0; //清除发送中断
}
}
//--------------------------------------------------------------------------------------------------
// 函数名称: COM_send()串口发送函数
// 函数功能: 把数据缓冲区的十位数据发送出去
//--------------------------------------------------------------------------------------------------
void COM_send(void)
{
RE_DE=1; //设置MAX483进入发送状态
for(point=0;point<=10,TI=1;point++) //连续发送十位数据
//把缓存区的数据都发送到串口
{
SBUF=buffer[point];
TI=0;
}
RE_DE=0; //设置MAX483进入接收状态
}
//--------------------------------------------------------------------------------------------------
// 函数名称: 主函数
// 函数功能: 调度个子函数,完成通信过程
//--------------------------------------------------------------------------------------------------
void main(void)
{
UART_init(); //初始化串口
do
{
}
while(point!=10); //判断数据是否接收完成
COM_send(); //地址匹配,数据完整接收,调用发送程序通知主机
SM2=0; //设置为点对点通信状态
}
我来回答
回答7个
时间排序
认可量排序
认可0
认可0
认可0
认可0
认可0
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2015-07-07 17:28:49
-
2018-12-10 16:34:16
-
52018-08-06 18:40:40
-
2015-03-19 17:55:09
-
02015-09-24 10:55:01
-
2016-03-25 01:48:19
-
2017-01-12 13:54:49
-
2015-09-21 15:45:59
-
2015-09-13 02:09:35
-
2008-11-19 18:58:18
-
2016-12-06 10:26:40
-
2018-07-18 14:24:51
-
2016-04-08 16:06:29
-
2023-10-18 09:55:52
-
2024-01-03 14:04:45
-
2018-12-18 14:22:51
-
2013-08-26 23:31:50
-
2013-08-28 13:47:26
-
2024-06-18 09:01:15
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认