C# 串行通信;配置rts

C# 串行通信;配置rts,c#,.net,C#,.net,我正试图通过配置为8n1且无握手的rs485连接与win ce设备通信。问题在于该设备有两种工作模式,分别作为接收器和发射器。为了在两种操作模式之间切换,我需要切换rts开/关。 我已经尝试过这样做,但是设备永远不会改变模式,除非我在启用或禁用rts的情况下使用断点。这让我相信有一个计时问题,在我发送任何东西之前,rts是打开和关闭的(默认模式是接收)。 我已经试着浏览了之前关于这个话题的问题,我也试过谷歌,但到目前为止我还没有发现任何东西。有人能帮忙吗 这是我的密码: public s

我正试图通过配置为8n1且无握手的rs485连接与win ce设备通信。问题在于该设备有两种工作模式,分别作为接收器和发射器。为了在两种操作模式之间切换,我需要切换rts开/关。 我已经尝试过这样做,但是设备永远不会改变模式,除非我在启用或禁用rts的情况下使用断点。这让我相信有一个计时问题,在我发送任何东西之前,rts是打开和关闭的(默认模式是接收)。 我已经试着浏览了之前关于这个话题的问题,我也试过谷歌,但到目前为止我还没有发现任何东西。有人能帮忙吗

这是我的密码:

    public static ushort Send_rs485(byte[] ToSend)
    {
        try
        {
            rs485.Write(ToSend, 0, ToSend.Length);

        }
        catch (TimeoutException)
        {
            MessageBox.Show("COM port error");
        }
        return (0);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        if (COM_opened)
        {
            bool CTS = false;

            rs485.RtsEnable = true;
            rs485_Execute_cmd(on_off);

            on_off = !on_off;
            rs485.RtsEnable = false;
        }
        else
        {
            MessageBox.Show("COM port not opened");
        }
        //rs485.RtsEnable = false;

    }

基本问题是
Write
不等待所有数据都被传输IIRC。当您以合理的方式进行通信时,这不是一个大问题,因为它仍然等待数据被缓冲(因此您不会尝试发送100 MiB/s),但如果您也在执行简单读写以外的其他操作(在您的情况下,更改管脚),这会产生同步问题

这意味着您必须等待,而串行端口上的通信通常相当缓慢。要获得您必须等待的时间,您需要知道正在发送的数据量和波特率。例如,要通过9600波特端口发送12个字节,您需要等待10毫秒


我不确定是否有什么东西可以让你感觉不那么脏。

一个解决方法是在Execute\u cmd调用(或至少在调用之后)周围放置两个
线程。Sleep
s。我似乎还记得,当COM端口在C#和各种设备的C代码中使用时,我在生产中经常看到这种情况。你严重低估了现代处理器的速度。如前所述,您只需打开信号几纳秒。设备能够看到的几率非常低。它在调试时工作,因为您会减慢它的速度。你需要一个计时器来再次关闭它。这个方案设计得很糟糕,如果设备没有给你任何切换模式的提示,你永远也不能完全确定你保持它足够长的时间。如果它真的这样做了,您似乎能够检测到它没有处于正确的模式,那么当然,一旦您检测到模式开关,就将其关闭。谢谢您的帮助。我现在已经解决了这个问题,不幸的是(就像Luaan提到的)它感觉很脏