Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# 需要.NET串行端口帮助,主要是在多个;“数据包”;_C#_.net_Serial Port - Fatal编程技术网

C# 需要.NET串行端口帮助,主要是在多个;“数据包”;

C# 需要.NET串行端口帮助,主要是在多个;“数据包”;,c#,.net,serial-port,C#,.net,Serial Port,我对通过.net通过串行端口发送数据非常陌生,我注意到,在实现了TCP对等协议之后,使用串行端口我不会那么容易 因此,从顶部开始,我的串行双向通信实现就快实现了,我只是在一些事情上遇到了困难:- 我的读取被拆分为多条消息,或通过COM端口作为分段响应接收,我不知道可能需要什么设置,也不知道应该如何编写不同的代码来修复此问题。这是什么原因造成的?我正在SerialPort\u DataReceived上的断点处检查消息。 基本上,数据应按以下方式发送: 01: LS|DA090521|TI1110

我对通过.net通过串行端口发送数据非常陌生,我注意到,在实现了TCP对等协议之后,使用串行端口我不会那么容易

因此,从顶部开始,我的串行双向通信实现就快实现了,我只是在一些事情上遇到了困难:-

  • 我的读取被拆分为多条消息,或通过COM端口作为分段响应接收,我不知道可能需要什么设置,也不知道应该如何编写不同的代码来修复此问题。这是什么原因造成的?我正在
    SerialPort\u DataReceived上的断点处检查消息。
  • 基本上,数据应按以下方式发送:

    01: LS|DA090521|TI111043|q
    02: PS|RN102|PTC|TA1040000|P#0|DA090521|TI111429|j
    
    但它正在被拆分(在每个请求读取的随机位置)

    -问题1已经回答,谢谢Chris W.和其他人!我现在有了一条消息,我希望它是从片段逐步构建的(注意STX,{msg body},ETX),然后在消息完全构建后执行一个操作,并使用线程安全队列运行,非常高兴。

    。2.我几乎每读一个周期都会收到一个“|”符号,这是由于我错误地设置了一个命令、串行通信的产物还是设备发送给我的东西?(但我不这么认为,因为超级终端连接显示该字符不是连续发送的。)

    . 3.你能确认我用各自的方法正确地读写数据吗

    谢谢大家看我的另外两个问题

    相关代码如下:

    ...
        //                          COM3,    9600,     None,   8,        One
        SerialPort = new SerialPort(comPort, baudRate, parity, dataBits, stopBits);
        if (SerialPort.IsOpen) SerialPort.Close();
        // SerialPort.RtsEnable = true; // Request-to-send
        // SerialPort.DtrEnable = true; // Data-terminal-ready
        SerialPort.ReadTimeout = 150; // tried this, but didn't help
        SerialPort.WriteTimeout = 150; // tried this, but didn't help
        SerialPort.Open();
    
        SerialPort.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);
    }
    
    void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        // Process received data
        SerialPort sp = (SerialPort)sender;
        byte[] buffer = new byte[sp.BytesToRead];
        int bytesRead = sp.Read(buffer, 0, buffer.Length);
    
        // message has successfully been received
        message = Encoding.ASCII.GetString(buffer, 0, bytesRead);
    }
    
    public bool SendMessage(string text)
    {
        // Only send message if a client is connected
        if (SerialPort != null && SerialPort.IsOpen)
        {
            byte[] buffer = Encoding.ASCII.GetBytes(text);
            SerialPort.Write(buffer, 0, buffer.Length);
        }
    }
    
    我的阅读被拆分为多条消息

    这是正常的、预期的、不可避免的行为。通过TCP传输的数据也可能发生这种情况。对于串行接口来说,它只是一个无穷无尽的字节流。应用程序负责将这些字节重新打包到数据包中

    如果数据包边界的位置很重要,并且如果您无法通过查看接收到的数据来判断数据包边界应该位于何处,那么您可能需要重新考虑数据的格式,以便能够判断数据包边界位于何处

    我几乎每读一个周期都会收到一个“|”符号


    那个字符的十六进制值是多少?查看是否将
    Handshake
    属性设置为
    XOnXOff
    RequestToSendXOnXOff
    可以改善这种情况。

    在较低级别,串行端口可以决定何时触发数据接收事件。它可能会在“完整”数据包到达之前决定这样做。但是,看起来您的预期数据集中有一个终止符字符。如果是这样,您可以执行以下操作(注意,我已更改了SerialPort分配以避免语法混乱:

            p = new SerialPort(PortName, BaudRate, Prty, DataBits, SBits);
            p.NewLine = Terminator;
    

    其中Terminator是一个包含终止字符的字符串。然后,您可以使用SerialPort.ReadLine()(如果适用,还可以使用SerialPort.WriteLine())。这至少可以帮助您解决第一个问题。

    我已经做了很多Win32串行端口编程,但对.NET只做了一点,所以请接受我的建议

    我的读取被拆分为多条消息,或通过COM端口作为分段响应接收,我不知道可能需要什么设置,也不知道应该如何编写不同的代码来修复此问题

    正如其他人所说,这是完全正常的。根据DCE端的设备类型,您可能需要自己重新包装。我不确定您连接的设备类型,因此我不能说更多

    如果要获取更多数据,可以尝试以下操作:

    • 调整System.Int32 ReceivedBytestThreshold属性
    • 使用同步I/O并指定要读取的固定字节数,而不是基于事件的接收
    我几乎每读一个周期都会收到一个“|”符号 这是因为我设置了一个命令 不知怎的,这是一个错误,是一个连环漫画的产物 通讯,或是设备上的东西 是你派我来的吗?我不这么认为 但是,作为超级终端连接 显示此角色未被删除 连续发送。)

    如果你对这条线路上发生的事情感到好奇,可以看看这是一个免费的应用程序,它可以在你通过线路传输数据时窥探你的com端口。这看起来很技术,但实际上你只需要看看IRP_MJ_WRITE和IRP_MJ_READ命令,在这条线路上你会看到以字节为单位的长度和通过线路发送的数据。有了这个你就可以了应该能够判断问题是否出在.NET SerialPort对象上,或者设备是否实际通过线路发送“|”

    你能确认我正在阅读和阅读吗 在数据库中正确写入数据 各自的方法


    它看起来适合基于事件的数据接收方法。

    谢谢你的回复,克里斯,谢谢。好吧,也许我想把这个放在太多的盒子里,如果你说的是我们几乎需要做我们自己的“数据包管理”,这很可耻(我没有意识到)可能是串行传输背后的基础,然后我可能需要查询msg的开头/结尾字符,将其打包,清洗并冲洗,然后重复。我不知道;默认的XON/XOFF值是0x13和0x11:-谢谢你的建议,克里斯!我现在正在逐步构建消息(注意STX,{msg body},ETX),然后在消息完全生成后执行一个操作,并使用线程安全队列运行,非常高兴。这是正确的方法,我确信您理解像“ETX”这样的词。在传递给Win32 SetCommTimeouts函数的COMMTIMEOUTS结构中还有一个名为ReadIntervalTimeout的有用属性,如果DCE发送整个数据包时每个字节之间几乎没有延迟,每个数据包之间也有延迟,那么这个属性可能适合您;但是.NET API显然不包含此函数/属性。感谢阅读
            p = new SerialPort(PortName, BaudRate, Prty, DataBits, SBits);
            p.NewLine = Terminator;