C#串口开放从设备产生奇数输出行为

时间:2017-04-12 18:09:19

标签: c# serial-port monitoring

我正在开发一个使用RAZOR D9OF(加速计,磁力计和陀螺仪)的项目我正在制作一个简单的C#表格,它打开了RAZOR所在的串口(在我的情况下它是' s端口4,@ 57600波特率)并列出该人的所有输出。

使用Arduino的串行监视器,我看到设备输出以下内容:

ITG: GOOD
HMC: GOOD
ADXL: GOOD

9DOF IMU Firmware v23 
==========================
[1]Accelerometer: ADXL345 
[2]Magnetometer: HMC5883 
[3]Gyroscope: ITG-3200 
[4]Raw Output
[5]Change Baud Rate: 57600bps
[Ctrl+z]Toggle Autorun
[?]Help

值得注意的是,每次关闭串行监视器,重新打开时,我都会收到来自设备的相同输出信息。

现在,在使用我的C#表单时,我按如下方式打开端口:

using (SerialPort port = new SerialPort("COM4", 57600))
{
    port.Open();

    string inp = port.ReadLine();

    while (!inp.Contains("Help")) // Looking for the '[?]Help' delimiter
    {
        Console.WriteLine(inp);
        inp = port.ReadLine();
    }

    //At this point the device is ready for input, send commands, and when done,

    port.Close();
}

第一次运行表单时,我得到了与预期相同的输出:

ITG: GOOD
HMC: GOOD
ADXL: GOOD

9DOF IMU Firmware v23 
==========================
[1]Accelerometer: ADXL345 
[2]Magnetometer: HMC5883 
[3]Gyroscope: ITG-3200 
[4]Raw Output
[5]Change Baud Rate: 57600bps
[Ctrl+z]Toggle Autorun

但是,每当我再次运行此代码时,在同一个表单会话中,结果输出如下:

  1. ' / R / R'
  2. 没什么,读取命令挂起
  3. 即使我关闭表单,并在调试模式下重新启动表单,第一个输出就是上面两个中的一个。设备重置为正常输出(例如Arduino串行监视器)的唯一时间是当我关闭设备电源并重新打开电源时,切换USB端口或按下板载重置按钮

    然后我尝试使用EventHandlers,如下所示:

    ... in PortOpen() ...
        _RAZOR_ = new SerialPort(cbCOMs.SelectedItem.ToString().Replace(" ", ""), getBaudRate());
        _RAZOR_.Open();
        _RAZOR_.DataReceived += new SerialDataReceivedEventHandler(_RAZOR_dataRecieved);
    
        private void _RAZOR_dataRecieved(object sender, SerialDataReceivedEventArgs e)
        {
            string telemetry = "";
            try { telemetry = _RAZOR_.ReadLine().ToString(); }
            catch { return; }
    
            Console.WriteLine(telemetry);
        }
    
    ... in CloseRAZORPort() ...
            _RAZOR_.Close();
            _RAZOR_.Dispose();
    

    并获得与以前相同的行为。

    I read that there may be a bug with .NET's implementation of SerialPort但我不确定我的情况是否与此类似......

    Arduino的串行监视器正在做一些事情来重置或重新加载我不做的设备,我相信,这就是造成输出奇怪行为的原因。

    有没有人有任何建议或说明可以帮我解决这个问题?每当我打开设备的端口时,我需要才能获得它在开头打印的设备状态。

0 个答案:

没有答案