搜索
bottom↓
回复: 38

请教:怎么让上位机精确1ms串口发送一帧数据

[复制链接]

出0入0汤圆

发表于 2022-7-13 19:26:43 | 显示全部楼层 |阅读模式
本帖最后由 chinaboy25 于 2022-7-13 19:27 编辑

请教:怎么让上位机精确1ms串口发送一帧数据?
现在Windows平台下 的 消息机制大概是15ms正负5ms左右触发一次,请问有方法做到1ms 触发一次,
之前听别人说 labwindows 好像可以做到。 不知道有办法能用C++写出来不?或者linux 下可以做到不?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出200入2554汤圆

发表于 2022-7-13 19:32:17 来自手机 | 显示全部楼层
这需求,最好是另找一台单片机发送

出0入475汤圆

发表于 2022-7-13 19:45:01 来自手机 | 显示全部楼层
楼上说的对
电脑干不了这事,哈哈,

出615入1076汤圆

发表于 2022-7-13 20:06:38 来自手机 | 显示全部楼层
本帖最后由 dukelec 于 2022-7-13 20:08 编辑

你要先說說你能接受的最壞情況下的時間誤差是多少
普通電腦用 rt-preempt 實時 linux 用戶空間做到 100us 以內誤差問題不大(最壞情況)
在 linux 內核空間或者其它實時 linux 方案可以更低

出0入98汤圆

发表于 2022-7-13 20:07:34 | 显示全部楼层
常规的Windows肯定不行,linux或者Windows RT这类带实时机制的可以

出0入0汤圆

 楼主| 发表于 2022-7-13 20:55:41 来自手机 | 显示全部楼层
rclong 发表于 2022-7-13 20:07
常规的Windows肯定不行,linux或者Windows RT这类带实时机制的可以
(引用自5楼)

听说labwindows可以

出0入0汤圆

 楼主| 发表于 2022-7-13 20:56:32 来自手机 | 显示全部楼层
dukelec 发表于 2022-7-13 20:06
你要先說說你能接受的最壞情況下的時間誤差是多少
普通電腦用 rt-preempt 實時 linux 用戶空間做到 100us  ...

(引用自4楼)

1ms就差不多了

出105入79汤圆

发表于 2022-7-13 22:46:31 | 显示全部楼层
要付出很大代价,cpu也基本废了

出1315入193汤圆

发表于 2022-7-14 08:28:32 | 显示全部楼层
上位机精确1ms串口发送一帧数据?
单片机的事情了

出0入55汤圆

发表于 2022-7-14 08:32:40 | 显示全部楼层
做不到,看看有没有大神做到

出0入16汤圆

发表于 2022-7-14 08:36:26 | 显示全部楼层
不能,具体发出去是由驱动决定的,上位机1ms的延时都是不准的。。。真不如单片机

出0入0汤圆

发表于 2022-7-14 08:36:40 | 显示全部楼层
labview和TWinCat都可以,这些软件本质是把x86多核cpu的分一个核出来当实时内核用,或者说是当单片机用来保证实时性。

出10入46汤圆

发表于 2022-7-14 08:58:18 | 显示全部楼层
1. Windows 7 以上,采用高精度定时器,勉强可以做到1ms. 如果系统无过多任务的话。但相对单片机而言误差仍然非常大。
2. Linux 可以做的精度更高些。95%接近1ms

所以,真正的高精度 另外一个单片机发送,才是正解

出0入0汤圆

发表于 2022-7-14 09:27:37 | 显示全部楼层
媒体定时器可以1ms以下分辨率

出100入0汤圆

发表于 2022-7-14 09:37:23 | 显示全部楼层
楼主描述不清,误差需要控制到多少,比如1ms±100us

出0入45汤圆

发表于 2022-7-14 09:45:08 | 显示全部楼层
本帖最后由 feibagezib 于 2022-7-14 09:47 编辑

短时间,主动传输办法还是有的,自定义delay函数  ,自定义循环  N次;   
//定义延迟函数
        public void delay(long delay_Time)
        {
            long stop_Value = 0;
            long start_Value = 0;
            long freq = 0;
            long n = 0;

            QueryPerformanceFrequency(ref freq);  //获取CPU频率
            long count = delay_Time * freq / 1000000;   //这里写成1000000就是微秒,写成1000就是毫秒
            QueryPerformanceCounter(ref start_Value); //获取初始前值

            while (n < count)
            {
                QueryPerformanceCounter(ref stop_Value);//获取终止变量值
                n = stop_Value - start_Value;
            }
        }

        private void button23_Click(object sender, EventArgs e)
        {
        
         。。。。
            for (dl_count = 0; dl_count < Change_i; dl_count++)
             {
                。。。
                sentParam(0xfff, 0, 0, 0xf9);

                delay(Change_tempA);
            }         
        }

出0入0汤圆

发表于 2022-7-14 09:48:36 | 显示全部楼层
Windows平台下可以用多媒体定时器,发送程序一定要精简

出0入0汤圆

发表于 2022-7-14 10:05:57 | 显示全部楼层
同问,1ms做不到,能否开个线程独占一个CPU核,当单片机用?

出0入0汤圆

 楼主| 发表于 2022-7-14 19:08:50 | 显示全部楼层
mcu5i51 发表于 2022-7-14 09:27
媒体定时器可以1ms以下分辨率
(引用自14楼)

不是定时器分辨率的问题是消息机制的问题,消息机制延时有15ms左右

出3670入191汤圆

发表于 2022-7-15 08:08:44 来自手机 | 显示全部楼层
搜索“how to make windows application more real time ",结果第一条就是这篇,看看有没有用:
https://docs.microsoft.com/en-us ... al-time-application

出0入0汤圆

 楼主| 发表于 2022-7-15 08:59:32 | 显示全部楼层
本帖最后由 chinaboy25 于 2022-7-15 09:00 编辑
Rabbitoose 发表于 2022-7-15 08:08
搜索“how to make windows application more real time ",结果第一条就是这篇,看看有没有用:
https://d ...
(引用自20楼)


试试看,我之前在任务管理器里面把任务优先级设置成实时,估计和这个效果是一样的,然而并没什么用,主要是串口底层驱动机制的问题,底层驱动机制是基于消息的,现在延时主要是在消息的延时上;
也不是说一点用都没有,偶尔有10ms的5ms的延时出来同样的也有20多ms的延时出来;

出300入477汤圆

发表于 2022-7-15 09:06:01 来自手机 | 显示全部楼层
chinaboy25 发表于 2022-7-15 08:59
试试看,我之前在任务管理器里面把任务优先级设置成实时,估计和这个效果是一样的,然而并没什么用,主要 ...
(引用自21楼)

谁说串口底层是基于消息的?
读写串口和读写文件是一样的函数,用阻塞式的读写就行了。io操作本身的耗时肯定是低于毫秒级别的

出0入0汤圆

发表于 2022-7-15 11:03:33 | 显示全部楼层
chinaboy25 发表于 2022-7-14 19:08
不是定时器分辨率的问题是消息机制的问题,消息机制延时有15ms左右
(引用自19楼)

多媒体定时器是不用消息的,采用回调方式,本质就是软中断

出0入0汤圆

发表于 2022-7-15 11:11:14 | 显示全部楼层
chinaboy25 发表于 2022-7-14 19:08
不是定时器分辨率的问题是消息机制的问题,消息机制延时有15ms左右
(引用自19楼)

悄悄告诉你,有些CNC软件是用PC并口直接控制步进驱动器的,可以精确输出100K分辨率控制信号;另外当初测试过,直接控制并口用时是1us(总线用时),如果底层没有改变,这就是极限了;

出235入235汤圆

发表于 2022-7-15 11:45:59 | 显示全部楼层
mcu5i51 发表于 2022-7-15 11:11
悄悄告诉你,有些CNC软件是用PC并口直接控制步进驱动器的,可以精确输出100K分辨率控制信号;另外当初测 ...
(引用自24楼)

这个有点牛了,

出0入0汤圆

发表于 2022-7-15 11:52:54 | 显示全部楼层
mcu5i51 发表于 2022-7-15 11:11
悄悄告诉你,有些CNC软件是用PC并口直接控制步进驱动器的,可以精确输出100K分辨率控制信号;另外当初测 ...
(引用自24楼)

竟然能切换到底层,谢谢提供的信息

出0入0汤圆

 楼主| 发表于 2022-7-15 12:53:47 来自手机 | 显示全部楼层
redroof 发表于 2022-7-15 09:06
谁说串口底层是基于消息的?
读写串口和读写文件是一样的函数,用阻塞式的读写就行了。io操作本身的耗时 ...

(引用自22楼)


就是用的阻塞函数另开线程一直读串口,通过打印接收时间发现,没有间隔低于15ms的收数据的时间,

出0入0汤圆

 楼主| 发表于 2022-7-15 12:57:25 来自手机 | 显示全部楼层
mcu5i51 发表于 2022-7-15 11:03
多媒体定时器是不用消息的,采用回调方式,本质就是软中断
(引用自23楼)

我试试看,之前看到过,我现在用的是c++的std库的定时器

出300入477汤圆

发表于 2022-7-15 13:05:18 来自手机 | 显示全部楼层
chinaboy25 发表于 2022-7-15 12:53
就是用的阻塞函数另开线程一直读串口,通过打印接收时间发现,没有间隔低于15ms的收数据的时间, ...
(引用自27楼)

是不是你之前设了读超时?
或者一次只读一个字节看看。
还有,取时间的函数用rdtsc,这个可以精确到你的cpu周期

出0入0汤圆

发表于 2022-7-15 14:54:13 | 显示全部楼层
可以试下用多媒体定时器来做

出10入95汤圆

发表于 2022-7-15 15:31:19 | 显示全部楼层
不懂上位机, 借楼请教大师, 像做modbus接收, 3.5个字符分包, 上位机是用超时做分包的吗? 还是远超了3.5个字符了

出300入477汤圆

发表于 2022-7-15 16:13:38 来自手机 | 显示全部楼层
ddcour 发表于 2022-7-15 15:31
不懂上位机, 借楼请教大师, 像做modbus接收, 3.5个字符分包, 上位机是用超时做分包的吗? 还是远超了3.5个字 ...
(引用自31楼)

没法保证。请不要依赖这一点,靠程序自己识别数据内容才保险。

出0入0汤圆

发表于 2022-7-15 16:22:28 | 显示全部楼层
ddcour 发表于 2022-7-15 15:31
不懂上位机, 借楼请教大师, 像做modbus接收, 3.5个字符分包, 上位机是用超时做分包的吗? 还是远超了3.5个字 ...
(引用自31楼)

上位机做主机的话接收分包时间几十毫秒都可以,反正就你一个主机,一切都在你掌控中

出0入0汤圆

 楼主| 发表于 2022-7-15 17:07:12 来自手机 | 显示全部楼层
redroof 发表于 2022-7-15 13:05
是不是你之前设了读超时?
或者一次只读一个字节看看。
还有,取时间的函数用rdtsc,这个可以精确到你的c ...

(引用自29楼)

应该是底层驱动做限制,并不是每个字节到来就通知你程序,而是要等到串口总线空闲再通知你程序,你程序读串口没有数据被阻塞,等串口数据到了,在唤醒你的的线程,这里面就涉及到了消息机制,

出10入95汤圆

发表于 2022-7-16 08:18:08 | 显示全部楼层
redroof 发表于 2022-7-15 16:13
没法保证。请不要依赖这一点,靠程序自己识别数据内容才保险。
(引用自32楼)

多谢大师!
现在学习用c#做了个小工具, 也是这么做的, 根据返回的长度, 结束接收.
现在想收到一个包,并通过CRC校验了, 再产生一个事件, 让屏幕刷新显示, 还没用用起来, 不会使用事件

出10入95汤圆

发表于 2022-7-16 08:21:26 | 显示全部楼层
modbus 发表于 2022-7-15 16:22
上位机做主机的话接收分包时间几十毫秒都可以,反正就你一个主机,一切都在你掌控中 ...
(引用自33楼)

虽然这样说也没错, 但是如果从站多了, 这样轮询周期就边长了

出0入16汤圆

发表于 2022-7-16 08:52:06 | 显示全部楼层
ddcour 发表于 2022-7-16 08:18
多谢大师!
现在学习用c#做了个小工具, 也是这么做的, 根据返回的长度, 结束接收.
现在想收到一个包,并通 ...
(引用自35楼)

C#一毫秒是不可能做到的,datareceived事件速度超慢,即使单独开个线程接受,1ms的线程切换延时也是不可靠的,
根据数据长度结束接受也是不可靠的,因为会有粘包半包等等问题,不可能刚好是想要的数据,
有的不可靠的时候帧头多个0xFF的都有。。。,最后导致接受完全错乱,还是要根据协议来,具体问题具体分析。

出10入46汤圆

发表于 2022-7-16 09:52:55 | 显示全部楼层
1.
发数据,难道不进行数据的消息传递?UI的呈现?
收数据,难道不进行数据的消息传递?UI的呈现?
这些才是最耗时的。

2.
主板原生并口,可以进行真IO的低延时传输,问题是现在有多少电脑带主板原生并口?


出0入0汤圆

发表于 2022-7-16 11:47:35 | 显示全部楼层
ddcour 发表于 2022-7-16 08:21
虽然这样说也没错, 但是如果从站多了, 这样轮询周期就边长了
(引用自36楼)

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

本版积分规则

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

GMT+8, 2024-5-29 18:49

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

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