uart 如果在发送8bit数据的某一位时被高优先级中断的问题
如题uart 如果在发送8bit数据的某一位时被高优先级中断了,中断恢复后发送数据能正常么? uart 是靠固定波特率来传输和判断数据位的,如果中间波特率停掉了,数据是不是就乱了?(假设高优先级必须要触发,不能在uart发送时屏蔽高优先中断) 本帖最后由 xy3dg12 于 2023-11-27 10:04 编辑
软串口?那肯定会数据错乱,可以用定时器定时发送,这样只要高优先级中断执行时间不太长就没事
或者定时器触发DMA控制IO发送,这样就不怕中断了 问了chatgpt,应该是会丢数据 ajfan 发表于 2023-11-27 10:04
问了chatgpt,应该是会丢数据
(引用自3楼)
硬件串口则无影响,发送时CPU不参与 这个不用问gpt了,自己看芯片手册就好。。。
串口描述章节肯定说清楚了的,怎么可能还会发着发着被打断,那个又不是cpu,怎么会打断, Himem 发表于 2023-11-27 10:05
硬件串口则无影响,发送时CPU不参与
(引用自4楼)
假如前4bit正常发送数据,然后暂停了30ms, 然后再发送剩下的4bit,从接收端看uart波特率是不连续的,不知道uart 是否能通过判断起始位和终止位将这8bit连起来? 串口是独立外设的话,不存在这个问题。
串口外设它内部是个状态机。CPU只是把1个字节传输到发送寄存器(不用FIFO的情况下),由串口自己的IP完成这么多bit的发送的,发送过程和CPU没有关系。 1a2b3c 发表于 2023-11-27 10:10
这个不用问gpt了,自己看芯片手册就好。。。
串口描述章节肯定说清楚了的,怎么可能还会发着发着被打断,那 ...
(引用自5楼)
如果高优先级中断为INT0,看datasheet比uart高,会不会在uart发送时会被INT0暂停掉 硬件uart没有你说的这个问题 ajfan 发表于 2023-11-27 10:21
如果高优先级中断为INT0,看datasheet比uart高,会不会在uart发送时会被INT0暂停掉 ...
(引用自8楼)
文档的意思是:
高优先级中断处理的时候, 串口无法中断. 也就是你这时候不能向串口写数据, 也读不了.可能导致接收的数据丢失, 也可能导致发送的数据有个间隔.
并不会导致发出个半拉子. 那是软串口, 你自己拿gpio模拟的才这样.
发半拉子对方可收不了, 这玩意接收端是按波特率定期采样的. ajfan 发表于 2023-11-27 10:14
假如前4bit正常发送数据,然后暂停了30ms, 然后再发送剩下的4bit,从接收端看uart波特率是不连续的,不知 ...
(引用自6楼)
你是自己通过io口模拟,1bit,1bit发出去的吗,如果是的话,那肯定就会出错呀 qtechzdh 发表于 2023-11-27 10:16
串口是独立外设的话,不存在这个问题。
串口外设它内部是个状态机。CPU只是把1个字节传输到发送寄存器(不 ...
(引用自7楼)
意思是uart 是1个字节为基础发送到寄存器, 不会在发送某一个bit时被中断掉? ajfan 发表于 2023-11-27 10:27
意思是uart 是1个字节为基础发送到寄存器, 不会在发送某一个bit时被中断掉? ...
(引用自12楼)
那当然了啊。 ajfan 发表于 2023-11-27 10:27
意思是uart 是1个字节为基础发送到寄存器, 不会在发送某一个bit时被中断掉? ...
(引用自12楼)
如果中断过来,就影响串口发送,这种单片机还能卖给你,大兄弟,设计芯片ip的人都是全世界智力领先的那一批人,你想到的问题,别人都已经研究过了。 看了下uart程序,果然是1字节发送的,所以可以保证字节的完整性
void Uart0Send(unsigned char Dbyte)
{
TI0=0;
SBUF0=Dbyte;
while(TI0==0);
}
void Uart0SendString(unsigned char *StrHead,unsigned char Number)
{
unsigned char n;
for(n=0;n<Number;n++)
{
Uart0Send(StrHead);
}
} 谢谢以上各位朋友的解释,get到了很多知识点 问题的核心是你没有告知具体的51单片机!
串口发送被高优先级中断打断后不会丢失数据,因为标准51单片机都是硬件串口,所以数据发送是以1byte为最小单位发送的,串口发送完成后通过查询发送完成标记得知发送结果。非常高优先中断第一件事就是关闭串口就就发送的数据天知道了。 追问个问题,我波特率设置500000通过uart 转TCP(模块),TCP端软件(TCP&UDP)收到数据的速率才7KByte/s左右,按理论是不是应该有30KByte/s的数据量?(500000/10-1ms包延时,每包1250Byte)
SSCOM串口软件 没有接收速率显示,大家知道有什么串口软件可以显示接收速率的么?准备MCU直接通过外挂串口及软件读下,排除下是否是uart转TCP模块的问题。 目前我还没见过哪个串口软件显示速度。事实上速度我们并不关心。
你只要确定不丢包就行。就是你发出去多少字节,看看上位机是否全部收到就行了。 因为对传输速率有要求(50Kbyte/s),另外加了uart转tcp模块后显示的速率太低了,所以如果有串口软件能显示速率就可以容易判断问题了。 自己内部1秒定时器,完了1秒内接受/发送了多少个字节,这样的算出来速率不行? 楼主是会思考的 ajfan 发表于 2023-11-27 10:04
问了chatgpt,应该是会丢数据
(引用自3楼)
这个GPT 是哪个网站呀....网上好多.感觉都不像是这二八经的网站. 用的是国内中转的一个网站,付费的,好像每个问题1毛还是2毛的,目前看能凑合用,但不能全信。
https://tdchatvip.us/ windows 超级终端 可以显示吞吐率 ajfan 发表于 2023-11-27 12:15
追问个问题,我波特率设置500000通过uart 转TCP(模块),TCP端软件(TCP&UDP)收到数据的速率才7KByte/s左 ...
(引用自18楼)
单片机程序啥中断都不要有,就唯一一个窗串口程序,这是第一个条件。
接下来,tcp一个祯数据里面包含许多物理层,协议层额外的数据,某种角度来说,tcp传输效益不高,tcp助手收到的数据,不是全部展现给你看的。是不是这方面原因呢。 lb0857 发表于 2023-11-29 06:45
单片机程序啥中断都不要有,就唯一一个窗串口程序,这是第一个条件。
接下来,tcp一个祯数据里面包含许多 ...
(引用自26楼)
主要问题不在这里。
影响吞吐量的首要问题是通迅的请求应答来回开销。如果你的串口能一直在工作,不是收就是发,那已经不错了。
大部分人是发请求,然后等别人处理,处理完了发回答,你要处理回答,然后才能发下一个请求。时间大头不是收发数据,而是等别人。。。
tcp跑在网口上都是发1500长度的大包的,控制信息开销是ip头20,tcp头20,这比起数据1460的来说几乎可以忽略。 redroof 发表于 2023-11-29 08:57
主要问题不在这里。
影响吞吐量的首要问题是通迅的请求应答来回开销。如果你的串口能一直在工作,不是收 ...
(引用自27楼)
哦哦
谢谢解答{:handshake:}
目前有一款产品也需要使用usrt转modbustcp模块(透传)
原产品是和PLC通讯,采用modbusrtu 每帧有效数据不超过5个字节
大部分都是一个字节这样传输
一旦和上位机进行modbustcp通讯;
比如0x10命令是读取多个寄存器,那么读取寄存器数量多少上位机程序上面可以设置吧
地址不是连续情况下 上位机也是1460个这样一包进行读取的吗 lb0857 发表于 2023-11-29 09:14
哦哦
谢谢解答
(引用自28楼)
各种做法都有。
简单的只管每个命令直接转发,网口得到的还是串口的速度。
复杂的会有缓存,它自己批量读到缓存,你从他内部直接读,不受串口速度限制。 redroof 发表于 2023-11-29 09:19
各种做法都有。
简单的只管每个命令直接转发,网口得到的还是串口的速度。
复杂的会有缓存,它自己批量读 ...
(引用自29楼)
从以往帖子知道
你一直做无线通讯及相关产品,很有这方面经验
麻烦推荐一下串口转modbustcp的模块
市场50-100元这个价位的哪一家模块最可靠 lb0857 发表于 2023-11-29 09:25
从以往帖子知道
你一直做无线通讯及相关产品,很有这方面经验
麻烦推荐一下串口转modbustcp的模块
(引用自30楼)
没得推荐,这个价钱太低了{:titter:}
我们的产品非常可靠,但价钱是用千做单位的。。。
页:
[1]