【问题标题】:Serial Communication not getting stopped with port.Stop Command串行通信没有被 port.Stop 命令停止
【发布时间】:2016-02-19 09:36:11
【问题描述】:

我一直在尝试停止与 port.Stop 和 port.Dispose() 的串行通信,但通信一旦建立就不会停止。

这是我的代码

Start 方法持续发送数据直到端口打开

public void Start(List<byte> RGBdata)
{           
    if (!m_port.IsOpen)
    {
        m_port.Open(); -- it fails over here when reloaded
    }           
    do
    {
        Break();
        Thread.Sleep( 5 );

        m_port.Write( new byte[] { 0 }, 0, 1 );
        SendData(RGBdata);
        Thread.Sleep( 1);
    }
    while (m_port.IsOpen());
}

破解方法

    private void Break()
    {
        m_port.BreakState = true;
        Thread.Sleep( 1 );
        m_port.BreakState = false;

    }

发送数据方法

    private void SendData(List<byte> data)
    {         

        m_port.Write( data.ToArray(), 0, data.Count );
    }

停止方法

public void Stop()
{
    m_port.Close();

    if (m_port.IsOpen)
    {
        m_port.Close();
        m_port.Dispose();
    }
}

【问题讨论】:

  • 您的代码存在一些问题。你能把SendDataBreak的代码也贴出来吗?
  • 您的计时机制Thread.Sleep 1 and 5 的值非常低。通常Thread.Sleep 的分辨率约为 30 毫秒。
  • 这段代码中没有多线程。你确定你在使用多个线程吗?如果不是 while (m_port.IsOpen()); 将永远是真的。作为旁注,最好举起旗帜来表示停止。
  • 是的,这就是我的问题,我有两个按钮开始和停止功能。在启动按钮上,它开始通信并永远循环。所以即使在停止点击它也不会停止通信,因为它不会进入 while 循环,一旦建立
  • 还有一件事 Stefan,为什么停止命令不起作用并处理,我的意思是无论状态如何,它都应该停止通信

标签: c# .net multithreading serial-port serial-communication


【解决方案1】:

如 cmets 中所述,您需要一个线程和一个信号标志来指示停止条件:

首先创建一个线程:

List<byte> gRGBdata;
bool stopRequested = false; //signaler flag
public void Start(List<byte> RGBdata)
{     
    gRGBdata = RGBdata; //copy to "global" variable

   //start thread
   //reset flag first
   stopRequested = false;
   Thread t = new Thread (new ParameterizedThreadStart(yourThread));
   t.Start();
}

并实现它:

public void yourThread()
{      
    if (!m_port.IsOpen)
    {
         m_port.Open(); -- it fails over here when reloaded
    }           
    do
    {
        Break();
        Thread.Sleep(50);

        m_port.Write( new byte[] { 0 }, 0, 1 );
        SendData(RGBdata);
        Thread.Sleep(30);
    }
    while (!stopRequested);

    if (m_port.IsOpen)
    {
         m_port.Close();
         m_port.Dispose();
    }
}

在停止命令时,只需发出一个标志:

public void Stop()
{
    stopRequested = true;
}

请注意,停止命令仅发出信号。缓冲区将被刷新到串行端口。如果升起标志,通信不会立即停止,但在您再次Start 之前不会有新的Send 命令。

这段代码还有很多问题,但希望它能让你更好地理解多线程和串口的使用方式。基本上:不要与来自不同线程的串行端口(或其他类似单例的硬件组件)通信。

警告:如果在胎面仍处于活动状态时多次调用 Start,此代码将失败。

【讨论】:

  • 好的,非常感谢 Stefam,让我试试这个
  • 仍有大量修复工作要做,例如:检查运行器标志以防止多线程启动。然后,防止快速点击场景。也许一些lock 语句会帮助你。
  • 不存在我的问题。我已经实现了一切,我无法通过端口停止通信。 DiscardOutbuffer、DiscardInBuffer 不起作用。每当我再次尝试访问端口时,它都会说访问 COM 端口被拒绝。我需要一次又一次地拔掉 USB 数据线来发送数据
  • 您必须确保从该线程关闭 com 端口。 DiscardBuffers 不起作用。你发送多少字节?
  • 雅斯特凡,我发送(512 * 3 = 1536 字节)。我试图用那个线程关闭,但它无法访问。例如,我在 start 方法中创建了这个线程。线程 t = new Thread (new ParameterizedThreadStart(yourThread)); t.Start();但是当我尝试在 Stop 方法中执行 t.Abort 时,线程无法访问为 t.Abort
猜你喜欢
  • 1970-01-01
  • 2020-04-12
  • 2017-07-15
  • 2013-03-09
  • 2020-06-08
  • 2020-11-15
  • 1970-01-01
  • 2012-05-28
  • 2020-04-12
相关资源
最近更新 更多