c# - 尝试从串行端口接收数据时遇到问题
问题描述
嗨,我有一个连接到我的电脑的端口,它不断地发送数据,我的目标是从中接收数据并将其打印出来。问题是我真的不知道它正在发送什么类型的数据以及我应该如何阅读它......
private void Button_Receive_Data_Click(object sender, EventArgs e)
{
GroupBox_Serial_Transmit.Enabled = false;
#region
string Port_Name = ComboBox_Available_SerialPorts.SelectedItem.ToString();
int Baud_Rate = Convert.ToInt32(ComboBox_Standard_Baundrates.SelectedItem);
COMport = new SerialPort(Port_Name, Baud_Rate);
#endregion
COMport.ReadTimeout = 3500; //3.5 sekundes
try
{
COMport.Open();
if (COMport.IsOpen == true)
{
TextBox_System_Log.Text = Port_Name + Environment.NewLine + Baud_Rate;
ReceivedData = COMport.ReadExisting();
this.Invoke(new EventHandler(ShowData));
GroupBox_Serial_Transmit.Enabled = true;
}
else
{
MessageBox.Show("Unable to Write to COM port ");
GroupBox_Serial_Transmit.Enabled = true;
COMport.Close();
}
}
catch (TimeoutException SerialTimeOutException)
{
MessageBox.Show(SerialTimeOutException.ToString());
COMport.Close();
GroupBox_Serial_Transmit.Enabled = true;
}
}
private void ShowData(object sender, EventArgs e)
{
TextBox_System_Log.Text = ReceivedData;
}
这是我的代码,它试图打开端口并读取数据。我尝试调试它,ReadExising 函数返回一串我无法理解的符号。我尝试了几种方法,但都没有奏效,现在我很绝望。很抱歉,可能有一些不必要的代码行,因为我是 SerialPort 通信的初学者。
解决方案
您所希望的只是串行发送可读的文本。在这种情况下,您的主要目标是计算波特率。由于您是初学者,只需安装docklight(或者可能是picocom 或您可用的任何工作工具)。尝试从最高(115200)开始的每个波特率 [检查下面的注释] 和 8 个数据,向下移动,并且对于您以这种方式检查的每个波特率,乱搞停止位和奇偶校验。
或者(感谢 Trevor 的启发)您可以运行一个工具来检查重复的 1 和 0。例如,如果您的流是 110011001100000011110011,那么好的候选者是 115200/2。对于 111000111000111000000111000111111111,一个好的候选人是 115200/3 等
为了完整起见,上述方法可能没有结论,因为数据“可能”实际上是 1100110011001100。这没有什么意义,因为这是一种非有效编码,但与原始问题一致,“我们不知道”串行发送的内容。
现在你的希望是你最终偶然发现了正确的配置并真正获得了可读的文本。如果这样做,您可以返回到 C# 并设置正确的配置并恢复调试。
如果您没有找到,这意味着数据是二进制格式,我们无法确定正确的传输配置和数据内容。
您的下一个赌注是保存足够长的日志并使用十六进制编辑器打开它。
笔记:
即使您可能会收到一些设备信息(例如波特率 9600),仍然建议使用上述步骤。Infact OP 偶然发现了错误的信息,而 9600 不起作用,115200 起作用。
115200 被认为是 UART 的最大值。但是通过适当的接口,您可以达到 230400 和 460800... 甚至更多。为了使这个答案面向未来,请验证您的硬件和串行驱动程序支持的接口最大值。
推荐阅读
- html - 边框宽度减小选择表单控制元素的高度
- r - 具有分隔变量的两列之间的差异;在 R 中
- php - 为什么我的“添加”按钮还会添加一个空对象
- javascript - Jquery - 通配符ID,如果第一次出现失败,条件值检查失败
- macos - 您无权在 Mac Mojave 中保存文件
- curl - 如何使用 cUrl 将计算机的名称/主机名传递给 Web Api 端点
- c# - Rest API Postman 配置部分不能在此路径中使用
- java - Java 简陋的视频屏幕录像机问题
- c - .bss 部分的意义
- python - Elasticsearch().ping() displays errors from urllib3 if the server is not up