谁和我说一下UART串口通信是如何接收发送数据的,while里面我这么编写, 下面是我的理解和问题

谁和我说一下UART串口通信是如何接收发送数据的,while里面我这么编写, 下面是我的理解和问题,第1张

串口只有一条数据线一条地线, 所以数据是以串行方式发送的,所谓串行就是数据按bit位依次发送,如下图

除了数据本身外一头一尾加上起始位和停止位(通知接收端表示数据的开始和结束), 有时还有校验位(发送数据的奇偶校验码), 取决于串口的工作方式

比如你在串口助手上发送字符串abc, 实际串口发送是发送字母a,再发送字母b,c等

再详细一点,字母a,二进制数表示是1100001, 发送它的流程是:

1)发送停止位

2)依次发送 1 0 0 0 0 1 1  (低位在前)

3)发送校验位

4)发送停止位

5)空闲

(下一字母发送)

发送是主动的,要先发数据才会有中断,没发数据,怎么会触发中断,这个逻辑你要清楚。一般发送用查询模式;

接收是被动的,接收中断由外部设备发送数据产生的。一般用中断接收方式。

如果这样理解应该很清楚了:

发送可以认为内部中断(TI=1,)

接收可以认为外部中断(RI=1,)

查询发送方式:

#include <reg52h>

#include <commonh>

#include <mineh>

void initial_uart();

main()

{

initial_uart();

while(1)

{

TI=0;

SBUF = 'A';

while(!TI);

TI=0;

}

}

void initial_uart()

{

TMOD = 0x20;//定时器1工作在模式2[自动重装模式]

SCON = 0x50;//使串口工作在模式1,打开串口接收功能[接收本程序没有用到]

PCON = 0x00;

TH1 = 0xFD;

TL1 = 0xFD;

TR1 = 1;//打开定时器1

ES = 1;//打开串口中断

EA = 1;//打开总中断

}

i++和++i的区别可以理解吗

哪个是先使用,那个是先赋值呢

i++是先使用i,然后i自增1;

++i,先加1,然后再使用;

虽然都是加一,但是是有区别的;

那么这个语句uartSend(s++);你理解了吗

当你发送一串字符串给单片机的时候,430刚接收到第一个字符于是开始进行回发固定数据给串口助手,可还没发送完毕(发送需要时间,而你尽然在接收中断里发送,这样接受中断就得不到及时响应),你第二个字符串又进来了,于是出错了。(第一件事还没干完,你第二件、第三件。。。全部紧接的来了,要你,你不疯?)这里的问题是你没搞明白整个流程,这个程序框架也不好。这种情况下,你需要建立一个缓存区(FIFO),中断的任务就是把接收到的数据扔到缓存,置标志位,并立马退出!在主程序里发送数据,这样就不会导致接收无法及时响应问题(这个跟蓄水池一样的道理)

以上就是关于谁和我说一下UART串口通信是如何接收发送数据的,while里面我这么编写, 下面是我的理解和问题全部的内容,包括:谁和我说一下UART串口通信是如何接收发送数据的,while里面我这么编写, 下面是我的理解和问题、个位大侠,我用51单片机从串口发送字符到电脑上,没有显示。UART 中断进不了,程序如下: 这是为什么呢、c语言指针++ void uartSendString(uchar *s) { while(*s等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存