chinaboy25 发表于 2022-7-13 19:26:43

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

本帖最后由 chinaboy25 于 2022-7-13 19:27 编辑

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

t3486784401 发表于 2022-7-13 19:32:17

这需求,最好是另找一台单片机发送

1a2b3c 发表于 2022-7-13 19:45:01

楼上说的对
电脑干不了这事,哈哈,

dukelec 发表于 2022-7-13 20:06:38

本帖最后由 dukelec 于 2022-7-13 20:08 编辑

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

rclong 发表于 2022-7-13 20:07:34

常规的Windows肯定不行,linux或者Windows RT这类带实时机制的可以

chinaboy25 发表于 2022-7-13 20:55:41

rclong 发表于 2022-7-13 20:07
常规的Windows肯定不行,linux或者Windows RT这类带实时机制的可以
(引用自5楼)

听说labwindows可以

chinaboy25 发表于 2022-7-13 20:56:32

dukelec 发表于 2022-7-13 20:06
你要先說說你能接受的最壞情況下的時間誤差是多少
普通電腦用 rt-preempt 實時 linux 用戶空間做到 100us...
(引用自4楼)

1ms就差不多了

qwe2231695 发表于 2022-7-13 22:46:31

要付出很大代价,cpu也基本废了

lb0857 发表于 2022-7-14 08:28:32

上位机精确1ms串口发送一帧数据?
单片机的事情了{:titter:}

jssd 发表于 2022-7-14 08:32:40

做不到,看看有没有大神做到{:lol:}

初音之恋 发表于 2022-7-14 08:36:26

不能,具体发出去是由驱动决定的,上位机1ms的延时都是不准的。。。真不如单片机

hexenzhou 发表于 2022-7-14 08:36:40

labview和TWinCat都可以,这些软件本质是把x86多核cpu的分一个核出来当实时内核用,或者说是当单片机用来保证实时性。

gonboy 发表于 2022-7-14 08:58:18

1. Windows 7 以上,采用高精度定时器,勉强可以做到1ms. 如果系统无过多任务的话。但相对单片机而言误差仍然非常大。
2. Linux 可以做的精度更高些。95%接近1ms

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

mcu5i51 发表于 2022-7-14 09:27:37

媒体定时器可以1ms以下分辨率

wochai 发表于 2022-7-14 09:37:23

楼主描述不清,误差需要控制到多少,比如1ms±100us

feibagezib 发表于 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);
            }         
      }

modbus 发表于 2022-7-14 09:48:36

Windows平台下可以用多媒体定时器,发送程序一定要精简

songxiang666 发表于 2022-7-14 10:05:57

同问,1ms做不到,能否开个线程独占一个CPU核,当单片机用?

chinaboy25 发表于 2022-7-14 19:08:50

mcu5i51 发表于 2022-7-14 09:27
媒体定时器可以1ms以下分辨率
(引用自14楼)

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

Rabbitoose 发表于 2022-7-15 08:08:44

搜索“how to make windows application more real time ",结果第一条就是这篇,看看有没有用:
https://docs.microsoft.com/en-us/windows/iot/iot-enterprise/soft-real-time/soft-real-time-application

chinaboy25 发表于 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的延时出来;

redroof 发表于 2022-7-15 09:06:01

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

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

mcu5i51 发表于 2022-7-15 11:03:33

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

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

mcu5i51 发表于 2022-7-15 11:11:14

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

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

lyping1987 发表于 2022-7-15 11:45:59

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

这个有点牛了,

yinian 发表于 2022-7-15 11:52:54

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

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

chinaboy25 发表于 2022-7-15 12:53:47

redroof 发表于 2022-7-15 09:06
谁说串口底层是基于消息的?
读写串口和读写文件是一样的函数,用阻塞式的读写就行了。io操作本身的耗时 ...
(引用自22楼)


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

chinaboy25 发表于 2022-7-15 12:57:25

mcu5i51 发表于 2022-7-15 11:03
多媒体定时器是不用消息的,采用回调方式,本质就是软中断
(引用自23楼)

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

redroof 发表于 2022-7-15 13:05:18

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

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

bad_fpga 发表于 2022-7-15 14:54:13

可以试下用多媒体定时器来做

ddcour 发表于 2022-7-15 15:31:19

不懂上位机, 借楼请教大师, 像做modbus接收, 3.5个字符分包, 上位机是用超时做分包的吗? 还是远超了3.5个字符了

redroof 发表于 2022-7-15 16:13:38

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

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

modbus 发表于 2022-7-15 16:22:28

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

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

chinaboy25 发表于 2022-7-15 17:07:12

redroof 发表于 2022-7-15 13:05
是不是你之前设了读超时?
或者一次只读一个字节看看。
还有,取时间的函数用rdtsc,这个可以精确到你的c ...
(引用自29楼)

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

ddcour 发表于 2022-7-16 08:18:08

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

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

ddcour 发表于 2022-7-16 08:21:26

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

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

初音之恋 发表于 2022-7-16 08:52:06

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

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

gonboy 发表于 2022-7-16 09:52:55

1.
发数据,难道不进行数据的消息传递?UI的呈现?
收数据,难道不进行数据的消息传递?UI的呈现?
这些才是最耗时的。

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


modbus 发表于 2022-7-16 11:47:35

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

想要快的话可以用多媒体定时器分包,5ms的分包间隔还是没问题的
页: [1]
查看完整版本: 请教:怎么让上位机精确1ms串口发送一帧数据