个粉丝

问答

专栏

资料

 发布于  2008-11-19 19:04:12
采纳率 0%
128个问答
5825

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;                  //设置为点对点通信状态   
}
我来回答
回答7个
时间排序
认可量排序

AOC

0个粉丝

19

问答

0

专栏

15

资料

AOC 2013-12-10 20:55:04
认可0
果断顶起来。。。mark

redwind

0个粉丝

0

问答

0

专栏

0

资料

redwind 2014-03-04 09:13:09
认可0
数据量大的话,还是开个循环缓冲区,程序有空就去查询一下好。

fobyellow

0个粉丝

6

问答

0

专栏

0

资料

fobyellow 2016-12-06 11:11:19
认可0
请教下问题,我们使用UART1做485的半双工接口,收发都没有问题,但是在发送的时候,无法判断是否已经发送完成,我们现在的处理办法是发送后延时一段时间后切换到接收状态,会遇到外设响应太快总线发生冲突的问题,求解决思路,谢谢!

stupid

0个粉丝

4

问答

0

专栏

0

资料

stupid 2017-03-25 22:26:00
认可0
谢谢楼主的分享!

charles1971

0个粉丝

1

问答

0

专栏

0

资料

charles1971 2018-01-25 18:03:31
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=42479&ptid=634]fobyellow 发表于 2016-12-6 11:11[/url]
请教下问题,我们使用UART1做485的半双工接口,收发都没有问题,但是在发送的时候,无法判断是否已经发送完 ...[/quote]

RS485的芯片 他的方向控制腳 要跟CTS/RTS接 (我忘了哪一根腳了). buffer裡面的字都傳出去之後. CTS/RTS(其中一根).會清掉. 這樣子就不會有你說的反應過快來不及收的問題

charles1971

0个粉丝

1

问答

0

专栏

0

资料

charles1971 2018-01-25 18:09:47
认可0
剛查了 應該是RTS腳  Request Send to Send.

charles1971

0个粉丝

1

问答

0

专栏

0

资料

charles1971 2018-01-25 18:14:46
认可0
這是我用的 可以同時支持485 半双工+全双工的線路. 只使用右邊就是半双工. 就是你現在需要的
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区