Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#SerialPort-混合具有不同波特率的端口的问题_C#_Serial Port_Baud Rate - Fatal编程技术网

C#SerialPort-混合具有不同波特率的端口的问题

C#SerialPort-混合具有不同波特率的端口的问题,c#,serial-port,baud-rate,C#,Serial Port,Baud Rate,我想通过串行接口连接两个设备,但它们的连接不兼容。为了解决这个问题,我将它们都连接到我的PC上,我正在开发一个C#程序,该程序将COM端口X上的流量路由到COM端口Y,反之亦然 该程序连接到两个COM端口。在DataReceived事件处理程序中,我读入传入数据并将其写入另一个COM端口。为此,我有以下代码: private void HandleDataReceived(SerialPort inPort, SerialPort outPort) { byte[

我想通过串行接口连接两个设备,但它们的连接不兼容。为了解决这个问题,我将它们都连接到我的PC上,我正在开发一个C#程序,该程序将COM端口X上的流量路由到COM端口Y,反之亦然

该程序连接到两个COM端口。在DataReceived事件处理程序中,我读入传入数据并将其写入另一个COM端口。为此,我有以下代码:

    private void HandleDataReceived(SerialPort inPort, SerialPort outPort)
    {
        byte[] data = new byte[1];

        while (inPort.BytesToRead > 0)
        {
            // Read the data
            data[0] = (byte)inPort.ReadByte();

            // Write the data
            if (outPort.IsOpen)
            {
                outPort.Write(data, 0, 1);
            }
        }
    }
只要输出COM端口的波特率高于输入COM端口,该代码就可以正常工作。如果传入的COM端口比传出的COM端口快,则我开始丢失数据。我必须像这样更正代码:

    private void HandleDataReceived(SerialPort inPort, SerialPort outPort)
    {
        byte[] data = new byte[1];

        while (inPort.BytesToRead > 0)
        {
            // Read the data
            data[0] = (byte)inPort.ReadByte();

            // Write the data
            if (outPort.IsOpen)
            {
                outPort.Write(data, 0, 1);
                while (outPort.BytesToWrite > 0);  //<-- Change to fix problem
            }
        }
    }
private void handledata已接收(SerialPort输入端口、SerialPort输出端口)
{
字节[]数据=新字节[1];
while(inPort.BytesToRead>0)
{
//读取数据
数据[0]=(字节)inPort.ReadByte();
//写下数据
if(输出端口等参线)
{
输出端口写入(数据,0,1);

while(outPort.BytesToWrite>0);//您应该确保
outPort.WriteBufferSize
大于您希望发送的最大缓冲区。此外,在循环中调用
ReadByte
WriteByte
通常会比较慢。如果您将处理程序更改为:

int NumBytes = 20; //or whatever makes sense
byte[] data = new byte[NumBytes];

while (inPort.BytesToRead > 0)
{
    // Read as much data as possible at once
    count = inPort.Read(data, 0, min(NumBytes, inPort.BytesToRead));

    // Write the data
    if (outPort.IsOpen)
    {
        outPort.Write(data, 0, count);
    }
}

这将减少开销,这应该会有所帮助按照您的预期处理计时。

您正在尝试的操作相当于从消防水龙带喝水。您依靠接收缓冲区来储存水,如果没有人关闭水龙头,它不会持续很久。通过您的解决方法,您可以确保接收缓冲区会无声地溢出,您可能没有这样做执行ErrorReceived事件

要使其正常工作,您必须告诉输入设备在缓冲区已满时停止发送。通过设置握手属性来完成此操作。首先将其设置为Handshake.RequestToSend。然后使用XOnXOff。这取决于设备是否正确使用握手信号

使用Read()方法可以提高效率


好的,不是消防水龙带。我只能想到另外一种可能性。早期UART芯片设计的一个常见问题是,他们有一个只能存储一个字节的片上接收缓冲区。这需要中断服务程序在下一个字节到达之前读取该字节。如果ISR不够快,芯片会打开串行错误。溢出状态和字节无法恢复地丢失

解决这个问题的一个方法是人为地在每个传输的字节之间设置一个延迟,使设备中的ISR有更多的时间来读取字节。作为一个副作用,这就是你的解决方案代码所做的


这并不是一个很好的解释,现代芯片设计有一个至少8字节深的FIFO缓冲区。如果这是真的,当你降低波特率时,你应该会看到问题消失。此外,使用Read()而不是ReadByte()应该会使问题变得更糟,因为你的Write()现在call一次可以传输多个字节,消除了字符间的延迟。说清楚了,我指的是输出设备。

是的,你说得对,这段代码就像从消防水龙带喝水。不幸的是,我应该写更多关于连接到这段代码的水龙带的内容。我正在发送<10字节的命令(响应小于10字节)在10 Hz时。我希望2-4K读/写缓冲区对我来说已经足够了。此外,我在第一个命令上看到了失败。因此,虽然我知道这段代码不能扩展到更大/更快的数据传输,但我很好奇为什么它不能用于小/慢传输。很抱歉没有更清楚。好的,应该可以。请明确说明“我看到了失败"。当然。假设我的命令是四个字节:0x01 0x02 0x3 0x4。COM X上的设备发送该命令。我可以看到C#程序接收四个字节并将它们发送到COM Y上的设备。COM Y上的设备接收两个字节:0x01 0x03。我知道COM Y上的设备是可靠的,所以我想知道这两个字节是如何删除的。我想知道about UART芯片有问题。它必须在PC端,因为两个连接的设备都有2K缓冲区。另一个奇怪的是丢失的字节非常一致。设备接收第一个字节,然后每隔一个字节接收一个。如果我发送:0x01 0x02 0x03 0x04 0x05,设备接收:0x01 0x03 0x05。我希望看到的更少与溢出条件或类似情况一致的结果:0x02、0x04、0x05。我应该指出,当我重新创建上述示例时,系统在没有解决方法的情况下工作了几次。然后它开始失败,并继续失败。因此,我现在有证据表明,它在不等待写入缓冲区耗尽的情况下工作,但随后它开始fai我不知道这是否有助于解决问题。嗯。。。。