搜索
bottom↓
回复: 30

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

[复制链接]

出340入0汤圆

发表于 2023-11-27 09:58:40 | 显示全部楼层 |阅读模式
如题
uart 如果在发送8bit数据的某一位时被高优先级中断了,中断恢复后发送数据能正常么? uart 是靠固定波特率来传输和判断数据位的,如果中间波特率停掉了,数据是不是就乱了?(假设高优先级必须要触发,不能在uart发送时屏蔽高优先中断)

出0入0汤圆

发表于 2023-11-27 10:03:49 | 显示全部楼层
本帖最后由 xy3dg12 于 2023-11-27 10:04 编辑

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

出340入0汤圆

 楼主| 发表于 2023-11-27 10:04:22 | 显示全部楼层
问了chatgpt,应该是会丢数据

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入984汤圆

发表于 2023-11-27 10:05:55 | 显示全部楼层
ajfan 发表于 2023-11-27 10:04
问了chatgpt,应该是会丢数据
(引用自3楼)

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

出0入475汤圆

发表于 2023-11-27 10:10:51 来自手机 | 显示全部楼层
这个不用问gpt了,自己看芯片手册就好。。。
串口描述章节肯定说清楚了的,怎么可能还会发着发着被打断,那个又不是cpu,怎么会打断,

出340入0汤圆

 楼主| 发表于 2023-11-27 10:14:21 | 显示全部楼层
Himem 发表于 2023-11-27 10:05
硬件串口则无影响,发送时CPU不参与
(引用自4楼)

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

出10入18汤圆

发表于 2023-11-27 10:16:22 | 显示全部楼层
串口是独立外设的话,不存在这个问题。
串口外设它内部是个状态机。CPU只是把1个字节传输到发送寄存器(不用FIFO的情况下),由串口自己的IP完成这么多bit的发送的,发送过程和CPU没有关系。

出340入0汤圆

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入18汤圆

发表于 2023-11-27 10:21:24 | 显示全部楼层
硬件uart没有你说的这个问题

出0入42汤圆

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

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

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

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

出0入224汤圆

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

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

出340入0汤圆

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

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

出10入18汤圆

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

那当然了啊。

出0入115汤圆

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

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

出340入0汤圆

 楼主| 发表于 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[n]);
        }
}

出340入0汤圆

 楼主| 发表于 2023-11-27 10:35:20 | 显示全部楼层
谢谢以上各位朋友的解释,get到了很多知识点

出145入215汤圆

发表于 2023-11-27 11:11:20 来自手机 | 显示全部楼层
问题的核心是你没有告知具体的51单片机!

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

出340入0汤圆

 楼主| 发表于 2023-11-27 12:15:25 | 显示全部楼层
追问个问题,我波特率设置500000通过uart 转TCP(模块),TCP端软件(TCP&UDP)收到数据的速率才7KByte/s左右,按理论是不是应该有30KByte/s的数据量?(500000/10-1ms包延时,每包1250Byte)

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

出0入131汤圆

发表于 2023-11-27 12:25:15 | 显示全部楼层
目前我还没见过哪个串口软件显示速度。事实上速度我们并不关心。

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

出340入0汤圆

 楼主| 发表于 2023-11-27 12:34:58 | 显示全部楼层
因为对传输速率有要求(50Kbyte/s),另外加了uart转tcp模块后显示的速率太低了,所以如果有串口软件能显示速率就可以容易判断问题了。

出0入475汤圆

发表于 2023-11-27 13:16:20 来自手机 | 显示全部楼层
自己内部1秒定时器,完了1秒内接受/发送了多少个字节,这样的算出来速率不行?

出0入0汤圆

发表于 2023-11-27 14:44:53 | 显示全部楼层
楼主是会思考的

出0入0汤圆

发表于 2023-11-28 08:21:34 | 显示全部楼层
ajfan 发表于 2023-11-27 10:04
问了chatgpt,应该是会丢数据
(引用自3楼)

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

出340入0汤圆

 楼主| 发表于 2023-11-28 12:13:06 | 显示全部楼层
用的是国内中转的一个网站,付费的,好像每个问题1毛还是2毛的,目前看能凑合用,但不能全信。
https://tdchatvip.us/

出0入0汤圆

发表于 2023-11-29 05:06:13 | 显示全部楼层
windows 超级终端 可以显示吞吐率

出1310入193汤圆

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

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

出300入477汤圆

发表于 2023-11-29 08:57:54 来自手机 | 显示全部楼层
lb0857 发表于 2023-11-29 06:45
单片机程序啥中断都不要有,就唯一一个窗串口程序,这是第一个条件。
接下来,tcp一个祯数据里面包含许多 ...

(引用自26楼)

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

出1310入193汤圆

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

哦哦
谢谢解答

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

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

出300入477汤圆

发表于 2023-11-29 09:19:38 来自手机 | 显示全部楼层

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

出1310入193汤圆

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

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

出300入477汤圆

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

没得推荐,这个价钱太低了
我们的产品非常可靠,但价钱是用千做单位的。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 14:24

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

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