单片机串行通信程序调试原因

单片机串行通信程序调试原因,第1张

串口UART作为嵌入式应用和通讯领域中最常用的接口之一,接口协议虽然简单,但在实际应用中不同设备之间的通讯也会存在各种小问题,下面对使用中各种常见的问题做下总结和梳理,可作为调试参考。串口可分为异步串口(UART)和同步串口(USART),后者多出时钟信号线用作通讯时信号同步。本偏仅介绍异步串口。

一、串口通信常见问题

串口通信乱码

串口通讯乱码通常是指接收方接收到的数据不符合预期,出现此情况时需要考虑的因素通常包含以下几个方面:

双方设定的串口参数是否匹配,需检查设置的:串口波特率、串口数据格式等参数。

串口通讯电压不匹配,不同的串口设备接收可正常进行解码的高低电平门限不同,如同样是33V串口通讯,A设备低电平门限15V,B设备低电平门限1V。当实际串口电压低电平只有15V时,B设备无法正常接收数据。又如:A设备为5V串口,B设备为33V串口,同样有电压不匹配的问题。

串口通讯实际工作波特率误差较大,即:串口工作实际波特率和理论值偏差较大,因一些MCU和串口设备所用时钟为了兼顾其他资源和应用需要,实际工作的串口速率和设定会有偏差。比如:标称为9600bps时,实际工作在了10000bps(误差超过4%),此时可能已经超出接收方的设计标准。

串口通讯信号质量差,如通讯时信号上升下降抖动严重,信号有过冲或者变化比较迟缓,此时检查硬件上共地是否良好,以及线路上有无串接/并联其他器件导致。

数据格式显示问题,通常使用十六进制或ASCII码格式居多,使用时需要区分。

串口无法发送

串口无法发送通常是指与此串口的TXD连接的对端设备RXD通道接收不到任何数据,总结如下:

使用仪器对TXD通道进行实际测量,观察硬件波形,确定信号是否有输出以及是否正常。(串口电压、串口信号上升下降时间)

短接设备的TXD和RXD通道回环测试,看自收发是否可以成功。排除是自身设备异常还是对端异常。

确定应用软件是否打开串口硬件流控,如当启用RTS/CTS硬件流控后但实际该引脚并没有连接或连接但不生效时,按照协议规定,CTS输入无效则发送方暂停发送数据。

MCU软件编码问题或计算机端软件工作异常。

串口无法接收

当串口接收不到任何数据的原因通常如下:

对端串口实际未能成功发送数据。

串口发送有效电压不满足芯片接收解码要求。

MCU软件编码问题或计算机端软件工作异常。

二、常用的排查小技巧

对于以上的常见串口调试问题,有以下几个方法和技巧可供参考使用。

使用硬件仪器

善于使用示波器等硬件采集或分析工具查找问题,用此方法可以确定线路上信号的串口电压、串口数据格式、串口通信波特率等参数。

串口Loopback检测

当手头没有硬件仪器时,将设备自身的TXD和RXD短接起来进行自收发测试也是一个不错的选择,此方式可以简单确认硬件通路和整个逻辑是否是打通的。但缺点是定位问题不够精准。

更换串口调试软件

计算机端串口软件种类较多,不排除一些设备或驱动软件没法成功适配所有的串口调试软件,此时可尝试多使用几款不同的软件对比测试。

三、串口通信基础

当两个设备使用UART进行通信时,它们至少通过三根导线连接:TXD串口发送、RXD串口接收、GND。串口设备通过改变TXD信号线上的电压来发送数据,接收端通过检测RXD线上的电压来读取数据。

什么是串口通信

计算机一次传输信息(数据)一位或多个比特位。串行是指传输数据一次只传输一位。当进行串口通信时发送或者接收的每个字(即字节或字符)一次发送一位。每一位都是逻辑‘1’或者‘0’。也用Mark表示逻辑1,Space表示逻辑0。

串口数据速率使用 bits-per-second ("bps") 或者 baud rate ("baud")。这表示一秒内可以传输多少逻辑1和0。当波特率超过 1000,你会经常看到用Kbps表示的速率。对于超过 1000000 的速率一般用Mbps 来表示。

1、如果要发送数据,将发送数据a赋给dat即主函数main{}里面写a=dat;就可以了

2、如果要发送一串数字,则定义一个数组,然后用for循环赋值就可以了

3、如果电脑以十六进制显示,则程序里面发的是十进制数,或者是字符,需在串口中断手动设置为十六进制显示即可

希望可以帮到你,如果!

有这样的 多串口连接模块

E232H4 4路RS-232高速隔离集线转换器

特点

▶ 实现一个串口设备与4个串口设备主从式通信

▶ 专用工业导轨槽模块

▶ 两端信号保持光电隔离;

▶ 全面容错机制,一路从节点损坏不影响其他节点通信

一般情况下,一主多从模式需要进行特定的配置,在UART工作模式中可选,如果配置方式不对的话可能会出现你说的这种情况。

如果配置有问题,从机在空闲状态下,发送端口仍然将电平钳位在高,防止出现误发0,使能发送的情况(详情请查下UART数据发送规则),如果有从机需要发送,欲将端口拉为0,但其他从机发送端口的输出能力强于单机,输出的电流使其无法将端口拉成0(详情请查下电平保持的实现),造成你遇到的情况。

如果配置正确的话,从机在空闲状态下将会将发送端口置于高阻态,接收端口处于监听状态,一主多从模式下主控端在主机,比较常见的都是应答机制工作模式,或者在有同步情况下采用分时工作模式。

串口通讯参考程序如下:

来源:深入浅出AVR单片机

#include<reg51h>

unsigned char UART_RX; //定义串口接收数据变量

unsigned char RX_flag; //定义穿行接收标记

/

函数名:UART串口初始化函数

调  用:UART_init();

参  数:无

返回值:无

结  果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)

备  注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]

//

void UART_init (void){

EA = 1; //允许总中断(如不使用中断,可用//屏蔽)

ES = 1; //允许UART串口的中断

TMOD = 0x20; //定时器T/C1工作方式2

SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)

TH1 = 0xF3; //定时器初值高8位设置

TL1 = 0xF3; //定时器初值低8位设置

PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)

TR1 = 1; //定时器启动

}

//

/

函数名:UART串口接收中断处理函数

调  用:[SBUF收到数据后中断处理]

参  数:无

返回值:无

结  果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)

备  注:过长的处理程序会影响后面数据的接收

//

void UART_R (void) interrupt 4  using 1{ //切换寄存器组到1

RI = 0;   //令接收中断标志位为0(软件清零)

UART_RX = SBUF; //将接收到的数据送入变量 UART_data

RX_flag=1;  //标记接收

//用户函数内容(用户可使用UART_data做数据处理)

//SBUF = UART_data; //将接收的数据发送回去(删除//即生效)

//while(TI == 0); //检查发送中断标志位

//TI = 0;  //令发送中断标志位为0(软件清零)

}

//

/

函数名:UART串口发送函数

调  用:UART_T ();

参  数:需要UART串口发送的数据(8位/1字节)

返回值:无

结  果:将参数中的数据发送给UART串口,确认发送完成后退出,采用非中断方式

备  注:

//

void UART_T (unsigned char UART_data){ //定义串口发送数据变量

ES=0;    //禁止穿行中断

SBUF = UART_data; //将接收的数据发送回去

while(TI == 0);  //检查发送中断标志位

TI = 0;   //令发送中断标志位为0(软件清零)

ES=1;   //打开穿行中断

}

/

函数名:UART串口发送字符串函数

调  用:UART_S ();

参  数:需要UART串口发送的数据(8位/1字节)

返回值:无

结  果:将参数中的数据发送给UART串口,确认发送完成后退出,采用非中断方式

备  注:

//

void UART_S(unsigned char str)

{

while(1)

{

if(str=='\0') break;

UART_T(str++);

}

}

/

函数名:主函数

调  用:main();

参  数:

返回值:无

结  果:

备  注:

//

void main()

{

unsigned char Buf_data[]={"      welcome to MCU world     \n\r"};

UART_init();

UART_S(Buf_data);

while(1){

if(RX_flag==1)

{

UART_T(UART_RX);

RX_flag=0;

}

}

}

祝愿楼主马到功成

以上就是关于单片机串行通信程序调试原因全部的内容,包括:单片机串行通信程序调试原因、怎么通过UART通信发送自己想要发送的变量、UART一分二串口线,接收发送数据的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10102013.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存