ajfan 发表于 2023-11-27 09:58:40

uart 如果在发送8bit数据的某一位时被高优先级中断的问题

如题
uart 如果在发送8bit数据的某一位时被高优先级中断了,中断恢复后发送数据能正常么? uart 是靠固定波特率来传输和判断数据位的,如果中间波特率停掉了,数据是不是就乱了?(假设高优先级必须要触发,不能在uart发送时屏蔽高优先中断)

xy3dg12 发表于 2023-11-27 10:03:49

本帖最后由 xy3dg12 于 2023-11-27 10:04 编辑

软串口?那肯定会数据错乱,可以用定时器定时发送,这样只要高优先级中断执行时间不太长就没事
或者定时器触发DMA控制IO发送,这样就不怕中断了

ajfan 发表于 2023-11-27 10:04:22

问了chatgpt,应该是会丢数据

Himem 发表于 2023-11-27 10:05:55

ajfan 发表于 2023-11-27 10:04
问了chatgpt,应该是会丢数据
(引用自3楼)

硬件串口则无影响,发送时CPU不参与

1a2b3c 发表于 2023-11-27 10:10:51

这个不用问gpt了,自己看芯片手册就好。。。
串口描述章节肯定说清楚了的,怎么可能还会发着发着被打断,那个又不是cpu,怎么会打断,

ajfan 发表于 2023-11-27 10:14:21

Himem 发表于 2023-11-27 10:05
硬件串口则无影响,发送时CPU不参与
(引用自4楼)

假如前4bit正常发送数据,然后暂停了30ms, 然后再发送剩下的4bit,从接收端看uart波特率是不连续的,不知道uart 是否能通过判断起始位和终止位将这8bit连起来?

qtechzdh 发表于 2023-11-27 10:16:22

串口是独立外设的话,不存在这个问题。
串口外设它内部是个状态机。CPU只是把1个字节传输到发送寄存器(不用FIFO的情况下),由串口自己的IP完成这么多bit的发送的,发送过程和CPU没有关系。

ajfan 发表于 2023-11-27 10:21:11

1a2b3c 发表于 2023-11-27 10:10
这个不用问gpt了,自己看芯片手册就好。。。
串口描述章节肯定说清楚了的,怎么可能还会发着发着被打断,那 ...
(引用自5楼)

如果高优先级中断为INT0,看datasheet比uart高,会不会在uart发送时会被INT0暂停掉

tang_qianfeng 发表于 2023-11-27 10:21:24

硬件uart没有你说的这个问题

albert_w 发表于 2023-11-27 10:24:17

ajfan 发表于 2023-11-27 10:21
如果高优先级中断为INT0,看datasheet比uart高,会不会在uart发送时会被INT0暂停掉 ...
(引用自8楼)

文档的意思是:
高优先级中断处理的时候, 串口无法中断. 也就是你这时候不能向串口写数据, 也读不了.可能导致接收的数据丢失, 也可能导致发送的数据有个间隔.

并不会导致发出个半拉子. 那是软串口, 你自己拿gpio模拟的才这样.

发半拉子对方可收不了, 这玩意接收端是按波特率定期采样的.

yyts 发表于 2023-11-27 10:24:55

ajfan 发表于 2023-11-27 10:14
假如前4bit正常发送数据,然后暂停了30ms, 然后再发送剩下的4bit,从接收端看uart波特率是不连续的,不知 ...
(引用自6楼)

你是自己通过io口模拟,1bit,1bit发出去的吗,如果是的话,那肯定就会出错呀

ajfan 发表于 2023-11-27 10:27:56

qtechzdh 发表于 2023-11-27 10:16
串口是独立外设的话,不存在这个问题。
串口外设它内部是个状态机。CPU只是把1个字节传输到发送寄存器(不 ...
(引用自7楼)

意思是uart 是1个字节为基础发送到寄存器, 不会在发送某一个bit时被中断掉?

qtechzdh 发表于 2023-11-27 10:30:54

ajfan 发表于 2023-11-27 10:27
意思是uart 是1个字节为基础发送到寄存器, 不会在发送某一个bit时被中断掉? ...
(引用自12楼)

那当然了啊。

三年模拟 发表于 2023-11-27 10:30:59

ajfan 发表于 2023-11-27 10:27
意思是uart 是1个字节为基础发送到寄存器, 不会在发送某一个bit时被中断掉? ...
(引用自12楼)

如果中断过来,就影响串口发送,这种单片机还能卖给你,大兄弟,设计芯片ip的人都是全世界智力领先的那一批人,你想到的问题,别人都已经研究过了。

ajfan 发表于 2023-11-27 10:34:35

看了下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);
        }
}

ajfan 发表于 2023-11-27 10:35:20

谢谢以上各位朋友的解释,get到了很多知识点

dz20062008 发表于 2023-11-27 11:11:20

问题的核心是你没有告知具体的51单片机!

串口发送被高优先级中断打断后不会丢失数据,因为标准51单片机都是硬件串口,所以数据发送是以1byte为最小单位发送的,串口发送完成后通过查询发送完成标记得知发送结果。非常高优先中断第一件事就是关闭串口就就发送的数据天知道了。

ajfan 发表于 2023-11-27 12:15:25

追问个问题,我波特率设置500000通过uart 转TCP(模块),TCP端软件(TCP&UDP)收到数据的速率才7KByte/s左右,按理论是不是应该有30KByte/s的数据量?(500000/10-1ms包延时,每包1250Byte)

SSCOM串口软件 没有接收速率显示,大家知道有什么串口软件可以显示接收速率的么?准备MCU直接通过外挂串口及软件读下,排除下是否是uart转TCP模块的问题。

asj1989 发表于 2023-11-27 12:25:15

目前我还没见过哪个串口软件显示速度。事实上速度我们并不关心。

你只要确定不丢包就行。就是你发出去多少字节,看看上位机是否全部收到就行了。

ajfan 发表于 2023-11-27 12:34:58

因为对传输速率有要求(50Kbyte/s),另外加了uart转tcp模块后显示的速率太低了,所以如果有串口软件能显示速率就可以容易判断问题了。

1a2b3c 发表于 2023-11-27 13:16:20

自己内部1秒定时器,完了1秒内接受/发送了多少个字节,这样的算出来速率不行?

shiva_shiva 发表于 2023-11-27 14:44:53

楼主是会思考的

sweet_136 发表于 2023-11-28 08:21:34

ajfan 发表于 2023-11-27 10:04
问了chatgpt,应该是会丢数据
(引用自3楼)

这个GPT 是哪个网站呀....网上好多.感觉都不像是这二八经的网站.

ajfan 发表于 2023-11-28 12:13:06

用的是国内中转的一个网站,付费的,好像每个问题1毛还是2毛的,目前看能凑合用,但不能全信。
https://tdchatvip.us/

tuy0326 发表于 2023-11-29 05:06:13

windows 超级终端 可以显示吞吐率

lb0857 发表于 2023-11-29 06:45:19

ajfan 发表于 2023-11-27 12:15
追问个问题,我波特率设置500000通过uart 转TCP(模块),TCP端软件(TCP&UDP)收到数据的速率才7KByte/s左 ...
(引用自18楼)

单片机程序啥中断都不要有,就唯一一个窗串口程序,这是第一个条件。
接下来,tcp一个祯数据里面包含许多物理层,协议层额外的数据,某种角度来说,tcp传输效益不高,tcp助手收到的数据,不是全部展现给你看的。是不是这方面原因呢。

redroof 发表于 2023-11-29 08:57:54

lb0857 发表于 2023-11-29 06:45
单片机程序啥中断都不要有,就唯一一个窗串口程序,这是第一个条件。
接下来,tcp一个祯数据里面包含许多 ...
(引用自26楼)

主要问题不在这里。
影响吞吐量的首要问题是通迅的请求应答来回开销。如果你的串口能一直在工作,不是收就是发,那已经不错了。
大部分人是发请求,然后等别人处理,处理完了发回答,你要处理回答,然后才能发下一个请求。时间大头不是收发数据,而是等别人。。。
tcp跑在网口上都是发1500长度的大包的,控制信息开销是ip头20,tcp头20,这比起数据1460的来说几乎可以忽略。

lb0857 发表于 2023-11-29 09:14:01

redroof 发表于 2023-11-29 08:57
主要问题不在这里。
影响吞吐量的首要问题是通迅的请求应答来回开销。如果你的串口能一直在工作,不是收 ...
(引用自27楼)

哦哦
谢谢解答{:handshake:}

目前有一款产品也需要使用usrt转modbustcp模块(透传)
原产品是和PLC通讯,采用modbusrtu   每帧有效数据不超过5个字节
大部分都是一个字节这样传输

一旦和上位机进行modbustcp通讯;
比如0x10命令是读取多个寄存器,那么读取寄存器数量多少上位机程序上面可以设置吧
地址不是连续情况下   上位机也是1460个这样一包进行读取的吗

redroof 发表于 2023-11-29 09:19:38

lb0857 发表于 2023-11-29 09:14
哦哦
谢谢解答


(引用自28楼)

各种做法都有。
简单的只管每个命令直接转发,网口得到的还是串口的速度。
复杂的会有缓存,它自己批量读到缓存,你从他内部直接读,不受串口速度限制。

lb0857 发表于 2023-11-29 09:25:18

redroof 发表于 2023-11-29 09:19
各种做法都有。
简单的只管每个命令直接转发,网口得到的还是串口的速度。
复杂的会有缓存,它自己批量读 ...
(引用自29楼)

从以往帖子知道
你一直做无线通讯及相关产品,很有这方面经验
麻烦推荐一下串口转modbustcp的模块
市场50-100元这个价位的哪一家模块最可靠

redroof 发表于 2023-11-29 09:41:50

lb0857 发表于 2023-11-29 09:25
从以往帖子知道
你一直做无线通讯及相关产品,很有这方面经验
麻烦推荐一下串口转modbustcp的模块
(引用自30楼)

没得推荐,这个价钱太低了{:titter:}
我们的产品非常可靠,但价钱是用千做单位的。。。
页: [1]
查看完整版本: uart 如果在发送8bit数据的某一位时被高优先级中断的问题