搜索
bottom↓
回复: 21

求嵌入式下C语言实现非阻塞方式读取字符串数据

[复制链接]
(172461011)

出0入0汤圆

发表于 2016-8-9 16:43:50 | 显示全部楼层 |阅读模式
如題所示:目前設備中有很多的模擬協議,但串口走的硬件,所以不像出現阻塞或者長時間中斷的情況
(172460075)

出0入0汤圆

发表于 2016-8-9 16:59:26 | 显示全部楼层
如果我没理解错的话,串口中断+缓冲区 可以解决啊
(172459936)

出0入0汤圆

发表于 2016-8-9 17:01:45 | 显示全部楼层
http://www.amobbs.com/thread-5604139-1-1.html

串口FIFO,坛子里有许多.
(172400886)

出0入0汤圆

 楼主| 发表于 2016-8-10 09:25:55 | 显示全部楼层
meirenai 发表于 2016-8-9 16:59
如果我没理解错的话,串口中断+缓冲区 可以解决啊

模擬SPI、I2C、one wire在通訊過程中不能被打斷,否則數據容易出現錯誤呀
(172400835)

出0入0汤圆

 楼主| 发表于 2016-8-10 09:26:46 | 显示全部楼层
e1ki0lp 发表于 2016-8-9 17:01
http://www.amobbs.com/thread-5604139-1-1.html

串口FIFO,坛子里有许多.

FIFO,會用中斷,模擬協議的時間太短了
(172397745)

出0入0汤圆

发表于 2016-8-10 10:18:16 | 显示全部楼层
是嵌入式Linux吗?如果是的话可以用fcntl设置成非阻塞方式读写
(172395580)

出0入0汤圆

 楼主| 发表于 2016-8-10 10:54:21 | 显示全部楼层
笑笑我笑了 发表于 2016-8-10 10:18
是嵌入式Linux吗?如果是的话可以用fcntl设置成非阻塞方式读写

基於MSP430,裸操作
(172391909)

出0入0汤圆

发表于 2016-8-10 11:55:32 | 显示全部楼层
中断尽量短,如果只是读取一个字节数据放到缓冲区,用不了几微秒时间,对模拟协议影响不大。
(172387351)

出0入0汤圆

 楼主| 发表于 2016-8-10 13:11:30 | 显示全部楼层
meirenai 发表于 2016-8-10 11:55
中断尽量短,如果只是读取一个字节数据放到缓冲区,用不了几微秒时间,对模拟协议影响不大。 ...


那如果是連續的字節送入呢?比如我現在的模擬SPI衹有150K,串口是115200的,這個不會照成很大的影響?
而且MSP430是出了名的慢,衹有8M的主頻,進出中斷都要時鐘
(172386604)

出0入0汤圆

发表于 2016-8-10 13:23:57 | 显示全部楼层
协议模拟也可以是非阻塞的,高频时钟中断中操作IO来模拟协议。
另外你这边需要更多定量的实验才能确定每个任务的时间消耗,然后妥善安排就好了,而且不排除安排不下去的可能,是很有可能的。
(172226300)

出0入0汤圆

 楼主| 发表于 2016-8-12 09:55:41 | 显示全部楼层
error_dan 发表于 2016-8-10 13:23
协议模拟也可以是非阻塞的,高频时钟中断中操作IO来模拟协议。
另外你这边需要更多定量的实验才能确定每个 ...

http://www.amobbs.com/thread-5530588-1-1.html

這種方式430是否有辦法可以實現嗎?
(172224406)

出0入0汤圆

发表于 2016-8-12 10:27:15 | 显示全部楼层
硬件如果有FIFO的话就用,如果没有硬件的那就软件来实现FIFO了。
(172199257)

出0入0汤圆

 楼主| 发表于 2016-8-12 17:26:24 | 显示全部楼层
百果 发表于 2016-8-12 10:27
硬件如果有FIFO的话就用,如果没有硬件的那就软件来实现FIFO了。

X現在最大的問題是軟件實現FIFO,可能打斷次數太多
(172198467)

出0入0汤圆

发表于 2016-8-12 17:39:34 | 显示全部楼层
gsq19920418 发表于 2016-8-12 09:55
http://www.amobbs.com/thread-5530588-1-1.html

這種方式430是否有辦法可以實現嗎?

链接里面是用了DMA完成读串口到内存动作,你用的单片机如果有DMA那就简单多了。
我觉得你现在首先需要的是针对你的应用做定量分析,模拟的通信协议需要何种时间精度,CPU如何实现模拟的协议最节约资源,比如说一个慢速的协议两个bit间延时长达1ms,那完成一帧的时间岂不是Nms,这个时间让CPU傻等着简直浪费。
至于串口那边,硬件限制了处理串口收发的软件结构范式,只有查询,中断和硬件FIFO这么几种方式,你发的链接里面严格来说也属于硬件fifo。
实际上程序安排妥当的时候,系统中存在一个高频时钟持续触发的情况下,低速串口通信即便是用查询的方式也不会丢数据的,比如9600波特率下一秒钟不到一千个字节,满打满算也就是1ms的周期,当你系统中有一个1ms的时钟在触发,那么每次触发的时候检查串口就行了,实际工程中通信接口不可能跑满。
继续用这个1ms的时钟,上面的模拟协议也就一起做了。

所以你首先要知道自己的系统中,CPU干每件事要多久,即使不能精确知道也要有一个数量级的估计,然后再来安排各种任务。
(172039914)

出0入0汤圆

 楼主| 发表于 2016-8-14 13:42:07 | 显示全部楼层
error_dan 发表于 2016-8-12 17:39
链接里面是用了DMA完成读串口到内存动作,你用的单片机如果有DMA那就简单多了。
我觉得你现在首先需要的 ...

谢谢!!!!!
(172003909)

出0入0汤圆

发表于 2016-8-14 23:42:12 | 显示全部楼层
430应该没dma吧,只能用中断了。觉得慢可以用汇编写中断服务程序。写个串口的话,不算进入退出时间,大概5到8条语句就行了。
另外就是如果cpu跟不上,那换cpu可能是最快解决方法。
再另外就是请用简体字……论坛字体本来就小
(171972952)

出0入0汤圆

发表于 2016-8-15 08:18:09 | 显示全部楼层
error_dan 发表于 2016-8-12 17:39
链接里面是用了DMA完成读串口到内存动作,你用的单片机如果有DMA那就简单多了。
我觉得你现在首先需要的 ...

这个回答中肯!
但,问题还得自己,动手,动脑,才能解决!
(171971310)

出0入0汤圆

发表于 2016-8-15 08:45:31 | 显示全部楼层
缓冲。。。
(169631520)

出0入4汤圆

发表于 2016-9-11 10:42:01 | 显示全部楼层
DMA+双缓冲区
(169618360)

出0入0汤圆

发表于 2016-9-11 14:21:21 | 显示全部楼层
gsq19920418 发表于 2016-8-10 09:25
模擬SPI、I2C、one wire在通訊過程中不能被打斷,否則數據容易出現錯誤呀

spi和iic可以被打断啊!!!
1 wire也不是全部不可以打断。
(169378523)

出0入0汤圆

 楼主| 发表于 2016-9-14 08:58:38 | 显示全部楼层
wswh2o 发表于 2016-9-11 14:21
spi和iic可以被打断啊!!!
1 wire也不是全部不可以打断。

嗯,是的,後來詳細看了下SPEC,確實是這樣
(169378491)

出0入0汤圆

 楼主| 发表于 2016-9-14 08:59:10 | 显示全部楼层
wswh2o 发表于 2016-9-11 14:21
spi和iic可以被打断啊!!!
1 wire也不是全部不可以打断。

謝謝!!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2022-1-26 18:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表