C# 串口每隔10ms接收,换机器后变15ms

angel_hl 2020-10-22 02:18:11
用了几种线程延时的方法,但是编译后的程序在别的机器上就显示休眠时间15ms,在自己的机器上就是10ms
int TimeMS =10;
while (SendDataTS_End)
{
while (SendDataTS_End)
{
Stopwatch sw = new Stopwatch();
sw.Start();

//Delay(TimeMS);
//Wait(TimeMS);
System.Threading.Thread.Sleep(TimeMS);
//Thread.SpinWait(TimeMS);
//Thread.Sleep(TimeMS);
sw.Stop();
long totalTime = sw.ElapsedMilliseconds;
}
}

public static void Wait(int ms)
{
DateTime t = DateTime.Now;
bool pd = true;
while (pd)
{
TimeSpan ts = DateTime.Now - t;
if (ts.TotalMilliseconds >= ms)
{
pd = false;
}
}
}


[DllImport("kernel32.dll")]
static extern uint GetTickCount();
static void Delay(uint ms)
{
uint start = GetTickCount();
while (GetTickCount() - start < ms)
{
//Application.DoEvents();
}
}
...全文
14145 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
又不是实时操作系统不该靠延迟去接收数据,而是通过事件通知去获取SerialPort.DataReceived 事件
ziqi0716 2020-10-26
  • 打赏
  • 举报
回复
System.Threading.Thread.Sleep()以及Timer等都是非精确计时(如1楼说的,跟系统计算资源等有关的),不能依赖这个.要不找其他实现(搜"C#精确计时"),要么采用事件机制,异步编程等,建议后者.
glen30 2020-10-26
  • 打赏
  • 举报
回复
windows不是实时操作系统,这种延时是不准的
dylike 2020-10-25
  • 打赏
  • 举报
回复
精度和Windows正在运行多少进程以及消息泵中有多少消息量决定,是不精确的时间,系统越忙碌,精度越差。

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧