0

我的 C# 桌面类库与 COM 串行端口通信。
com不是真正的com,它是一根USB to COM线连接到另一台电脑上的USB to COM,另一台电脑使用模拟器发送数据。

此解决方案工作正常,然后端口成功打开:

serialPort.Open();
if (serialPort.IsOpen)
{
   serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
}

void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  try
  {
     var length = serialPort.BytesToRead;
     byte[] buffer = new byte[length];
     serialPort.Read(buffer, 0, length);
     for (int i = 0; i < buffer.Length; i++)
     {
        System.IO.File.AppendAllText(@"c:\TestLogging.txt", string.Format("[Time = {0}]  Data was received from serial port !", DateTime.Now));         }
     } 

模拟器一直在发送数据,我在课堂上收到数据,但我不是一直收到,我看到每 30 秒打印 1 行 - 尽管它假设一直打印!

有什么奇怪的 - 如果我在 var length = .. 行中放置断点,那么我会看到我在休息时停止的打印.. 传输的数据似乎是“缓存的”,当我点击“播放”时我收到了数据,但仅限于我暂停进程的时间。

4

3 回答 3

2

我认为您在DataReceived那里注册事件处理程序为时已晚。您应该在打开端口之前注册它:

serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
serialPort.Open();
if (serialPort.IsOpen)
{

}
于 2013-10-01T11:45:18.923 回答
1

尝试使用超级终端连接您的机器并检查通信是否正常。如果是这样,那么这是您的应用程序的错误(仔细检查串行端口设置)。否则可能是电缆或端口本身。

你确定你没有得到任何错误的数据吗?您是否订阅了SerialPort.ErrorReceived事件处理程序?如果你在那里发现了一些SerialError.Frame错误,那么你可能有一个故障电缆或端口坏了,或者有一些情况会干扰通信(不太可能发生变化,但它可能会发生,例如,如果有一些强大的来源附近的电源,例如逆变器)。

于 2013-10-01T12:21:43.420 回答
0

好的,有什么问题?
我使用的是 USB 到 COM 电缆,而不是真正的 COM 端口。
从 SerialPort 接收数据事件的行为是不同的。
侦听并捕获数据事件,但不是获取字节数组(如在真实 COM 中) - 我每次都会收到一个字节(大小为 1 的数组)..
含义:使用 USB 到 COM 端口时发生 DataReceived 事件:我明白了:1-1-1-1-1-1 每个 DataReceived 事件给我 1 个字节。
真正的物理 COM .DataReceived 事件给我:5-30-42 等.. 字节数组
所以我在处理 USB 到 COM 端口时的解决方案(有些人可能称之为“虚拟 COM 端口”)我需要检查 serialPort.BytesToRead 是否比 X 大,然后我实际上做

if (serialPort.BytesToRead > 2) //I dont want to get it 1-1-1.. want to get it atleast 2-2-2-2
    serialPort.Read(buffer, 0, length);

由于 serialPort.BytesToRead 会告诉我当前块中有多少字节,然后读取。以我的方式将获得缓冲区并清理它。

于 2013-10-02T06:35:07.500 回答