485通信出现自发自收的情况

通常485通信是半双工,通过收发控制位RE/DE 转变收发状态。默认情况下是接收状态,等待数据传入。当需要发送时,先将发送使能,发送结束后再将接收使能。

当出现自发自收情况,自己发送的数据触发了自身的串口中断,可能是电路设计不一样,RE/DE控制位不是直接用芯片的引脚控制的。可以通过芯片UART寄存器控制串口的接收使能,避免自发自收。
在这里插入图片描述
位 3 TE:发送器使能 (Transmitter enable) ,该位使能发送器。该位由软件置 1 和清零。
0:禁止发送器
1:使能发送器
位 2 RE:接收器使能 (Receiver enable) ,该位使能接收器。该位由软件置 1 和清零。
0:禁止接收器
1:使能接收器并开始搜索起始位

如图中F4芯片的UART控制寄存器CR1中的,RE是接收使能位,串口接收数据前该位必须使能,即置1。
为了避免自发自收的情况,可以在发送前关闭接收使能,这样就不会接收到自己发送的数据了,发送结束后再重新使能。

huart3.Instance->CR1  &= ~(1<<2);	//发之前关掉RE标志位, 直接关闭UART接收使能。
HAL_UART_Transmit(&huart3,(uint8_t *)pData,Size,100);
while(HAL_UART_GetState(&huart3) == HAL_UART_STATE_BUSY_TX);   
huart3.Instance->CR1  |= (1<<2);    //发送结束后重新使能UART接收

此外,如果发现串口接收的数据与实际数据存在差异,可以适当降低波特率,如之前采用115200,改为9600.

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
c8051可以通过以下步骤实现串口通信自发自收: 1. 配置串口工作模式:通过设置串口控制寄存器(SCON)的相关位,选择串口的工作模式、波特率等参数。 2. 发送数据:将要发送的数据写入串口数据寄存器(SBUF)中,串口会自动将数据发送出去。 3. 接收数据:当有数据从串口发送过来时,串口会自动将数据存储到SBUF中,并触发串口中断。在中断服务函数中,可以将接收到的数据读取出来,进行处理。 4. 自发自收:为了实现自发自收,需要在中断服务函数中实现一个循环,不断地将读取到的数据写入SBUF中,以实现自发自收的功能。 下面是一个简单的c8051串口通信自发自收代码示例: ```c #include <c8051f020.h> void main() { // 串口配置 SCON = 0x50; // 选择工作模式为模式1 TMOD = 0x20; // 定时器1工作在模式2 TH1 = 0xfd; // 波特率设置为9600bps TL1 = 0xfd; // 定时器1启动 TR1 = 1; // 中断配置 IE = 0x90; // 允许串口中断和定时器1中断 IP = 0x10; // 将串口中断优先级设为高 // 启用全局中断 EA = 1; // 循环发送和接收数据 while(1) { // 发送数据 SBUF = 0x55; // 接收数据 // 数据将在中断服务函数中处理 } } // 串口中断服务函数 void serial_ISR() __interrupt 4 { // 发送和接收数据 SBUF = SBUF; } ``` 在该代码中,我们通过设置SCON和TMOD寄存器来配置串口的工作模式和波特率,然后启动定时器1,并开启中断。在主循环中,我们通过不断地向SBUF中写入数据来实现自发自收的功能。在中断服务函数中,我们将读取到的数据再次写入SBUF中,实现了自发自收的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值