我有一个硬件,它以以下形式向com端口发送数据:" HxxxxVxxxx"其中x =数字:例如:(H1234V5678)。
我想问一下,我该如何设置采样率以尽快发送。 (波特9600,8位,奇偶校验:无,停止位:1)。 用Java或C#编写的程序能够整体而不是部分地回收这些数据。
每22ms发送一次数据,并接收此类数据:
2014-08-11 18:48:39.669 56 36 36 37
2014-08-11 18:48:39.674 48 30 0D 0A
2014-08-11 18:48:39.687 56 36
2014-08-11 18:48:39.692 36 39 48 30
2014-08-11 18:48:39.696 0D 0A
2014-08-11 18:48:39.712 56 36 36 38
2014-08-11 18:48:39.716 48 30 0D 0A
2014-08-11 18:48:39.732 56 36
2014-08-11 18:48:39.737 36 37 48 30
2014-08-11 18:48:39.742 0D 0A
2014-08-11 18:48:39.753 56
但我想的是:
2014-08-11 18:48:39.600 56 36 36 37 48 30 0D 0A
2014-08-11 18:48:39.622 56 36 36 37 48 30 0D 0A
2014-08-11 18:48:39.644 56 36 36 37 48 30 0D 0A
2014-08-11 18:48:39.666 56 36 36 37 48 30 0D 0A
2014-08-11 18:48:39.688 56 36 36 37 48 30 0D 0A
c#code:
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff");
int bytes = comport.BytesToRead;
byte[] buffer = new byte[bytes];
comport.Read(buffer, 0, bytes);
File.AppendAllText(@"c:\file.txt", timestamp + " "+ByteArrayToHexString(buffer) +"\n" + Environment.NewLine);
}
答案 0 :(得分:2)
您收到的数据看起来与以下格式略有不同:" HxxxxVxxxx"
我阅读您的日志的方式,您正在接收" V66H0 \ r \ n"。 (\ r =回车,\ n =换行)
如果您可以保证所有单个命令都以\ r \ n(0x0D,0x0A)结尾,那么您有2个选项:
创建一个缓冲区并继续添加它,直到你达到0x0D 0x0A,然后你可以将它作为一行处理。
您可以将代码更改为使用同步SerialPort.DataRecieved方法,而不是使用异步SerialPort.ReadLine()事件,该方法将一次读取整行。
< / LI> 醇>这显然是简化的,但应该是这样的:
public bool KeepRunning = true;
while(KeepRunning)
{
string command = serialport.ReadLine();
processCommand(command);
}
其中serialport是已经打开的SerialPort对象,而processCommand是一种处理整行的方法。
答案 1 :(得分:0)
更改波特率不会为您提供所需的结果 。 SerialPort类(也不是任何基于Stream的类,这是类试图模拟的)保证接收的数据的确切数量将是您请求的数量。如果您需要8字节块,则需要缓冲传入数据,每次获得8字节数据时,都会返回结果。
你需要在读取串口和File.AppendAllText
之间放一层来缓冲,这样你就可以建立起来,直到你有8个字节的数据,然后写出文件。
private byte[] buffer = new byte[8];
private int bufferOffset = 0;
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int totalBytesToRead = comport.BytesToRead;
int totalBytesRead = 0;
while (totalBytesToRead > totalBytesRead)
{
//Chooses the remaining size in the buffer or the remaining bytes available to read, whichever is smaller.
var bytesToRead = Math.Min(buffer.Length - bufferOffset, totalBytesToRead - totalBytesRead);
var bytesRead = comport.Read(buffer, bufferOffset, bytesToRead);
bufferOffset += bytesRead;
totalBytesRead += bytesRead;
//If we have filled our buffer write it out to the file.
if (bufferOffset == buffer.Length)
{
string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff");
File.AppendAllText(@"c:\file.txt", timestamp + " " + ByteArrayToHexString(buffer) + "\n" + Environment.NewLine);
bufferOffset = 0;
}
}
}