我正在使用C#和串口(USB转串口)从警察扫描仪读取数据。当我在不同的程序中查看数据时,没有问题。当我使用下面的代码时,我会得到重复(重复)的所有行。我做错了什么?
SerialPort _sp = new SerialPort();
_sp.BaudRate = 115000;
_sp.DataBits = 8;
_sp.Parity = Parity.None;
_sp.StopBits = StopBits.One;
以及启动串口读取的功能......
public void StartSerial()
{
_sp.PortName = comboPorts.SelectedItem.ToString();
_sp.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
_sp.Open();
}
和读取功能......
private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
String strLine = _sp.ReadLine();
// Handle Data
}
catch { }
}
手册说明需要以下内容:
要查看CCDump数据,请使用USB PC / IF电缆将收音机连接到个人计算机。启动终端程序或第三方应用程序软件。配置“115200,N,8,1”的通信参数如下:
COM端口:计算机分配给USB电缆的COM端口号。如果您运行的是Windows操作系统,则可以在“设备管理器”中的“端口”下找到此信息。
奇偶校验:无
波特率:每秒115,000位
字:8位
停止比特:1
答案 0 :(得分:1)
在我看来,即使只有一行数据,serialPort_DataReceived事件已被多次触发,
检查设置,应该有一个阈值,这意味着如果数据长度小于阈值,那么事件将不会被触发。
同时,请确保您只注册一次事件......
答案 1 :(得分:1)
您必须一次读取可用的任何数据。不要使用ReadLine,因为它不清楚设备使用哪个字符发送LF或CR,或者甚至将它们发送给您。而是使用它:
int totalBytes = _sp.BytesToRead;
byte[] buffer = new byte[totalBytes];
_sp.Read(buffer, 0, totalBytes);
或
string line = _sp.ReadExisting();
答案 2 :(得分:1)
我正在编写一个应用程序,它通过USB记录串行数据并遇到类似的问题,其中我得到了不完整(部分)数据,重复数据和最差,两者的组合。问题是后者解决了。
原因是DataReceive
不会一致地触发,并且如果没有配置限制,它可能会触发它更喜欢它。我所做的是设置 EOP字符,因此应用程序将缓冲,直到它读取EOP并仅记录完整的数据字符串一次并等待下一个 EOP字符以记录下一个数据。有关相关讨论,请参阅this SO post。
在我的情况下,我将{CR+LF}
(即运营商返回和新行)附加到我的数据字符串的每一端作为我的 EOP字符。每个数据串,例如"Hello world"
,已发送"Hello World{CR}{LF}"
。在我设置端口,波特率和其他属性的代码中,我还设置了NewLine
属性以匹配我为设备设置的 EOP字符:
myPort.NewLine = "\r\n";
答案 3 :(得分:1)
好的,我找到了答案。数据是作为重复发送的,所以我无能为力。