zachary0101 发表于 2010-12-20 17:36:49

PC接受串口数据,如果长时间不读出旧数据会被覆盖吗?

各位大侠,小弟想请教下串口的处理机制的问题!
以前玩单片机时也经常用串口,但都是传些简单的数据,只管实现功能就行了,没太注意底层机制。最近一个项目有点复杂,单片机处理不了要上PC,装Linux系统。实现的主要功能是从串口读出传来的音频数据然后进行解码处理,下一帧要读多少字节的数据要根据本次解码情况而定,也就是说每次读的字节数不定。由于做的是音频解码,整个系统要求实时性高。现在有如下问题不明白!

第一,我个人理解PC这边应该存在一个串口缓冲区,否则的话万一读晚了数据不就丢了?如果有的话,这个缓冲区多大?是硬件实现的还是操作系统决定的?我能否在软件中改变这个大小?

第二,如果缓冲区满了,我却没及时把数据读出来,那新的数据是会覆盖旧的数据还是装不进去新数据了?如果覆盖的话是从头覆盖还是像FIFO一样将数据依次向前推?

第三,假如我的函数要从串口读200个字节,但这时候只传过来100个字节。那我的程序是在那等着,啥时候够200个字节了再一起读出来,还是有多少就读多少?或者不够的数据用0补?

第四,本人对linux也不是很熟,请问用什么方式读串口比较好?我试过直接用read函数读,但可能是缓冲区里的数据不够,读回来的数据有问题,解码时报错。我也试过先用select函数判断是否有数据再读,效果基本一样。见有人用fread读,我没试过,请问有什么区别吗?如果是用单片机的话,我一定用中断读。但PC不知是否有硬件中断?我看有人用过linux的串口中断,但一直没搞清楚,系统提供的软件中断到底什么情况下发生?是每收到一个字符就产生中断,还是遇到0x1a或0x1d才产生中断?或是其他什么情况?请高手解答!

第五,串口是否可以传非ASCII码?之前我以为可以直接传,但调试时minicom崩溃了,估计是数据里有什么特殊指令。我现在是把所有16进制数据转成ASCII码传输,然后接收时再转回16进制,基本能实现功能但效率很低,请问有没有更好的方法?

在坛子里找个好多关于串口的帖子,基本都是给代码,很少涉及原理和处理机制!希望了解的人给指点一下,本人不胜感激!

first_blood 发表于 2010-12-20 17:45:57

改成二进制传输就可以,缓冲区自己可以设,长时间存储保存到数据库就行了,一般是流传输,所以自己做好数据的格式检验

zachary0101 发表于 2010-12-20 18:24:10

感谢first blood这么快就回复了!那缓冲区数据不够时是等待数据还是有多少数据就返回多少啊?满了的话按什么规则覆盖呢?

xiesx1985 发表于 2010-12-20 20:38:51

之前有同学碰到过,用FPGA+ARM(Linux系统)
linux中的函数执行完都有特定的返回值;譬如说,溢出。需要增加一些函数的处理结果

NJ8888 发表于 2010-12-20 20:48:34

回复【2楼】zachary0101
感谢first blood这么快就回复了!那缓冲区数据不够时是等待数据还是有多少数据就返回多少啊?满了的话按什么规则覆盖呢?
-----------------------------------------------------------------------
WINDOWS下
不应当让它满,你要及时取,你开个1M也行,不会总不取吧?会出致命错误,程序崩溃退出

tfdsensor 发表于 2010-12-20 22:14:15

等牛人给你解答,俺先扔块砖头
串口缓冲区win下可以设定大小,你可以用串口的别的针加上硬件流控,当缓冲区快满就通知发送方别发了。建议直接传输二进制,读前先读出缓冲区内数据长度,然后读干净缓冲区。
如果你能够定义一个好协议,事情就好办

zachary0101 发表于 2010-12-21 13:55:08

非常感谢大家的关注!平时总感觉自己会的东西不少,但真正用起来总会遇到各种各样的问题,看来做技术的还是要从基础学起啊!专业不是电子类的,以前只用过51、AVR之类的单片机,虽然用过STM32也只是当单片机来用没上系统。现在转到linux下编程,思路一时间转不过来,还是单片机的过程编程思想,根本发挥不出操作系统的优势!

昨晚痛定思痛决定从基础一点一点看起,在网上找到一篇Serial Programming Guide for POSIX Operating Systems,写的挺详细也挺实用!有需要的可以看看http://www.easysw.com/~mike/serial/serial.html

感觉坛子里玩linux的人还是太少,有没有关于linux编程的QQ群啊?大家给推荐个!
页: [1]
查看完整版本: PC接受串口数据,如果长时间不读出旧数据会被覆盖吗?