主题 : 串口缓冲区的处理  LINUX   MICRO2440 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 6846
精华: 0
发帖: 55
金钱: 425 两
威望: 215 点
综合积分: 110 分
注册时间: 2009-06-19
最后登录: 2012-03-21
楼主  发表于: 2009-08-21 10:20

 串口缓冲区的处理  LINUX   MICRO2440

485串口发送的问题解决了,现在有点串口接收的问题搞不明白:
1、LINUX下的S3C2440A接收缓冲区是多大?取决于LINUX程序对它的设置吗?
2、什么办法可以解决缓冲区内数据分离?比如,数据包A、数据包B的全部以及数据包C的前一半在缓冲区内,有什么好的方法可以将他们分离吗?只有靠数据包头和数据包格式来判断吗?

3、有没有办法判断串口已经没有数据发来了再去读缓冲区?最重要的就是这一条。

感谢各位大大!帮小弟点拨一下吧。
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2009-08-21 11:35

 Re:串口缓冲区的处理 LINUX  MICRO2440

3、有没有办法判断串口已经没有数据发来了再去读缓冲区?最重要的就是这一条。

是我语文有问题还是你写的有问题?为什么我看不懂你想问什么呢?
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 侠客
UID: 6846
精华: 0
发帖: 55
金钱: 425 两
威望: 215 点
综合积分: 110 分
注册时间: 2009-06-19
最后登录: 2012-03-21
2楼  发表于: 2009-08-21 12:56

 Re:Re:串口缓冲区的处理 LINUX  MICRO2440

引用第1楼kasim于2009-08-21 11:35发表的 Re:串口缓冲区的处理 LINUX  MICRO2440 :

是我语文有问题还是你写的有问题?为什么我看不懂你想问什么呢?

是我写的有问题
我的本意是:能否在从机对主机发送的数据包发送完成时,即当前没有数据在发送时,主机才去读缓冲区,因为缓冲区里的数据包不是等长的,所以我是想,能把整的N个数据包一次性读取也好分析,不想在从机还处在发送状态时我就去读缓冲区。


问了好多人,得到的答案基本都是:不能。
不知道有没有其它好的方案去读取并分析串口缓冲区的数据,我的情况是: 接收的数据包不是等长的,主机ARM发送查询,接收到的数据包可能是一个,可能是两包(一包传不完的话)。
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
3楼  发表于: 2009-08-21 13:44

 Re:串口缓冲区的处理 LINUX  MICRO2440

串口驱动(物理层)只是负责把接收到的数据包传递给需要它的人(协议层或者更高层应用程序),驱动根本没有数据包格式的概念,只有一个byte一个byte的0101。把收到的数据按照一定的格式(协议)重新组包(reassemble)是驱动层之上的模块应该做的事,准确的说,是通信协议层。
最简单的例子是TCP/IP,你不可能让你的网卡驱动去解析TCP包,那是操作系统的TCP/IP协议栈做的事情。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 侠客
UID: 6846
精华: 0
发帖: 55
金钱: 425 两
威望: 215 点
综合积分: 110 分
注册时间: 2009-06-19
最后登录: 2012-03-21
4楼  发表于: 2009-08-21 14:05

 回 3楼(kasim) 的帖子

好像你说的这些不是我想要知道的,不过还是非常感激总版主大人!

我想要知道的是:串口接收到数据都往缓冲区去堆,,虽然有顺序,但是,我要去把这些数据分析出来,一般会采取什么方法比较合适?可以简语程序来表示一下吗?我以前只做过单片机的UART通信,那个简单的呀,只有一字节的缓冲区,有数据来了马上中断,马上读数据就OK了。可是在LINUX+ARM下,缓冲区这么大……
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
5楼  发表于: 2009-08-21 14:33

 Re:串口缓冲区的处理 LINUX  MICRO2440

我把你的问题换个说法:
假设每个包有两个字节,现在你一下收到了3个字节数据,头上两个是一个完整的数据包,最后一个是下一个数据包的头一个,你怎么办?对着它们发呆?
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 侠客
UID: 6846
精华: 0
发帖: 55
金钱: 425 两
威望: 215 点
综合积分: 110 分
注册时间: 2009-06-19
最后登录: 2012-03-21
6楼  发表于: 2009-08-21 14:48

 回 5楼(kasim) 的帖子

我还是打个比方说我这个情况吧。

比如:
第一包 3字节
第二包 5字节
第三包 6字节

那我去读,一下读到10字节,怎么办?我想要知道的比较合理的处理方式,当然不会站那对着数据发呆。
比如,我是应该先解析前面两包,然后再同时去读第三包后半包数据?还是有什么更好的办法?
定时读缓冲区吗?还是别的办法?
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
7楼  发表于: 2009-08-21 15:08

 Re:串口缓冲区的处理 LINUX  MICRO2440

呵呵,这个问题有意思
我是应该先解析前面两包,然后再同时去读第三包后半包数据?还是有什么更好的办法?

你认为什么是更好的办法,不等下一包的数据收全了就拿去处理?


定时读缓冲区吗?还是别的办法?

1) 定时去读,看看后续数据来了没
2) 等着设备告诉你后续数据来了,然后去读出来。(没来之前该干嘛干嘛去)
你喜荒一种?
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."