串口只有一条数据线一条地线, 所以数据是以串行方式发送的,所谓串行就是数据按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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)