很多朋友会碰到这个问题:单片机接收从电脑串口发送出来的一串字符串,却只能接收到第一个字符,其他的都丢失了或者是接收到的是乱码,却不知道是什么原因。其实,那是因为,虽然单片机的是全双工串口,但是串口的缓冲区(SBUF)却一般只有一个字节,即1Byte,远没有像电脑串口的缓冲区以KB计算那么大,并且,单片机的处理速度是很有限的,试想一下,假如要求一串字符串以9600bps的速率,一个起始位,一个结束位,无校正位,相当于960Byte/s传输到单片机,单片机要是能够全部接收的话,那么单片机接收和处理一个字节的时间仅为约1ms的时间。这说明了,如果单片机的处理速度不够快,还没有将接收到的上一帧数据及时转送到单片机的RAM中,而电脑串口又传输过来一帧新的数据,这帧新的数据就会把单片机的串口输入缓冲区的SBUF给刷新掉,或者说单片机压根就没有接收到新的一帧数据,造成了数据的丢失或接收到乱码。 如果需要单片机接收到从串口发送过来的一段很长的字符串,并且能够都正常接收和显示,这在网上还找不到例子。 在这里,笔者提供了一种方法,通过单片机内部最高中断等级的中断源不断的查询从电脑串口发送过来的字符,并及时将接收到的字符串通过外接的1602显示屏显示出来。 这里用最为常见的51单片机作为例程,因为51单片机处理速度比较慢,所以需要将电脑串口发送速率调整为最低的600bps,那么单片机端接收和处理一个字符的时间约要求为14ms左右,基本足够了。这个14ms间隔的定时处理和查询工作,由单片机的最高等级内部中断源来控制,以保证电脑发送过来的每个字符单片机都能及时的去处理。 #i nclude <reg52.h> unsigned char receive[32]; sbit rs=P3^2; void delay1ms(unsigned int f) void receivem(void) void timer_int(void) SCON =0x50; EA=1; void time0(void) interrupt 1 using 1 void write_com(unsigned char com) void write_data(unsigned char dat) void lcd_int(void) void dis(void) void main() |
单片机实现接收从电脑发送过来的字符串的方法
转载单片机实现接收从电脑发送过来的字符串的方法【转】
qcmc 发表于 - 2011-6-23 0:52:00
上一篇:软件模拟PWM
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
flex socket.writeObject()发送对象,java接收flex socket发送过来的对象
参考文章://java与as3,amf交互相互解析vo数据例子 //Amf3数据格式http://d2100.com/questions/39379 //flex 和 java 序列化的对象使用的套接字通信-------------------------------------------------------------------
flex socket发送对象 AMF协议 AMF3 socket.writeObject java socket -
python拦截发送过来的udp包
第一部分# fiddler工具"""命令行下断点: bpu 域名 (实现请求前的断点拦截)bpu https://www.baidu.com bpu 回车 取消拦截 bpafter 域名(拦截响应包) bpa 回车(取消响应包的拦截) 设置网页元素的重定向,当服务器上的某个文件需要替换时,可以重定向到本地文件,没问题时再替换线上文件""""""模
python拦截发送过来的udp包 python app爬虫 fiddler mitmproxy