我正在开发一个使用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
但是,每当我再次运行此代码时,在同一个表单会话中,结果输出如下:
即使我关闭表单,并在调试模式下重新启动表单,第一个输出就是上面两个中的一个。设备重置为正常输出(例如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的串行监视器正在做一些事情来重置或重新加载我不做的设备,我相信,这就是造成输出奇怪行为的原因。
有没有人有任何建议或说明可以帮我解决这个问题?每当我打开设备的端口时,我需要才能获得它在开头打印的设备状态。