gsq19920418 发表于 2016-8-9 16:43:50

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

如題所示:目前設備中有很多的模擬協議,但串口走的硬件,所以不像出現阻塞或者長時間中斷的情況

meirenai 发表于 2016-8-9 16:59:26

如果我没理解错的话,串口中断+缓冲区 可以解决啊

e1ki0lp 发表于 2016-8-9 17:01:45

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

串口FIFO,坛子里有许多.

gsq19920418 发表于 2016-8-10 09:25:55

meirenai 发表于 2016-8-9 16:59
如果我没理解错的话,串口中断+缓冲区 可以解决啊

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

gsq19920418 发表于 2016-8-10 09:26:46

e1ki0lp 发表于 2016-8-9 17:01
http://www.amobbs.com/thread-5604139-1-1.html

串口FIFO,坛子里有许多.

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

笑笑我笑了 发表于 2016-8-10 10:18:16

是嵌入式Linux吗?如果是的话可以用fcntl设置成非阻塞方式读写

gsq19920418 发表于 2016-8-10 10:54:21

笑笑我笑了 发表于 2016-8-10 10:18
是嵌入式Linux吗?如果是的话可以用fcntl设置成非阻塞方式读写

基於MSP430,裸操作

meirenai 发表于 2016-8-10 11:55:32

中断尽量短,如果只是读取一个字节数据放到缓冲区,用不了几微秒时间,对模拟协议影响不大。

gsq19920418 发表于 2016-8-10 13:11:30

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

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

error_dan 发表于 2016-8-10 13:23:57

协议模拟也可以是非阻塞的,高频时钟中断中操作IO来模拟协议。
另外你这边需要更多定量的实验才能确定每个任务的时间消耗,然后妥善安排就好了,而且不排除安排不下去的可能,是很有可能的。

gsq19920418 发表于 2016-8-12 09:55:41

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

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

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

百果 发表于 2016-8-12 10:27:15

硬件如果有FIFO的话就用,如果没有硬件的那就软件来实现FIFO了。

gsq19920418 发表于 2016-8-12 17:26:24

百果 发表于 2016-8-12 10:27
硬件如果有FIFO的话就用,如果没有硬件的那就软件来实现FIFO了。

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

error_dan 发表于 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干每件事要多久,即使不能精确知道也要有一个数量级的估计,然后再来安排各种任务。

gsq19920418 发表于 2016-8-14 13:42:07

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

谢谢!!!!!

runapp 发表于 2016-8-14 23:42:12

430应该没dma吧,只能用中断了。觉得慢可以用汇编写中断服务程序。写个串口的话,不算进入退出时间,大概5到8条语句就行了。
另外就是如果cpu跟不上,那换cpu可能是最快解决方法。
再另外就是请用简体字……论坛字体本来就小

ppdd 发表于 2016-8-15 08:18:09

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

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

ycping 发表于 2016-8-15 08:45:31

缓冲。。。

acmilannast 发表于 2016-9-11 10:42:01

DMA+双缓冲区

wswh2o 发表于 2016-9-11 14:21:21

gsq19920418 发表于 2016-8-10 09:25
模擬SPI、I2C、one wire在通訊過程中不能被打斷,否則數據容易出現錯誤呀

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

gsq19920418 发表于 2016-9-14 08:58:38

wswh2o 发表于 2016-9-11 14:21
spi和iic可以被打断啊!!!
1 wire也不是全部不可以打断。

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

gsq19920418 发表于 2016-9-14 08:59:10

wswh2o 发表于 2016-9-11 14:21
spi和iic可以被打断啊!!!
1 wire也不是全部不可以打断。

謝謝!!!!
页: [1]
查看完整版本: 求嵌入式下C语言实现非阻塞方式读取字符串数据