[英]how to read integer values from serial port in C#?
我有一个通过RS-232通信的Keyence相机。 它被配置为在触发时输出三个整数值。 我在读取整数值时遇到问题。 我尝试使用char数组缓冲区,但它仅读取输出中的第一个+号。 我用腻子测试过,输出是这样的
+ 346.0,+ 261.0,098
我想知道是否有什么需要读取这些整数值的?
static void Main(string[] args)
{
char[] buffer1 = new char[200] ;
SerialPort port = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
port.Open();
if (port.IsOpen) { Console.WriteLine("port is now open"); } else { Console.WriteLine("port not opened correctly"); }
port.Write("T"); //triggers the camera
port.Read(buffer1, 0, 200);
for (int i = 0; i < 200; i++)
{
Console.WriteLine(buffer1[i]);
}
Console.ReadLine();
}
从串行端口读取数据之前,我并没有读取预期的所有内容。
原来我正在读取设备的响应,但尚未编写。 我认为串行端口对象将继续尝试填充缓冲区,直到达到读取超时为止,而事实并非如此。
在我的场景中,我知道要从串行端口读取多少个字符。 因此,如果您知道可以对读取执行重复操作,直到字符缓冲区已满。 我不知道如果从SerialPort.BaseStream读取是否同样适用。
SerialPort serialPort;
char[] buffer = new char[expectedLength];
int totalBytesRead = 0;
//continue to read until all of the expected characters have been read
while (totalBytesRead < expectedLength)
{
totalBytesRead += serialPort.Read(buffer, totalBytesRead, expectedLength - totalBytesRead);
}
这是我使用的代码(简体):
public class Scanner : SerialPort
{
private string _word;
private int _globalCounter;
private readonly char[] _rxArray = new char[2047];
public Scanner()
{
DataReceived += MyDataReceivedEventHandler;
}
public event EventHandler<CodeScannedEventArgs> CodeScanned;
private void MyDataReceivedEventHandler(object sender, SerialDataReceivedEventArgs e)
{
do
{
var rxByte = (byte)ReadByte();
// end of word
if (rxByte == 10)
{
// first byte (02) and last two bytes (13 and 10) are ignored
_word = new string(_rxArray, 1, _globalCounter - 2);
DisplayData(_word);
_globalCounter = 0;
}
else
{
_rxArray[_globalCounter] = (char)rxByte;
_globalCounter++;
}
} while (BytesToRead > 0);
}
private void DisplayData(string receivedText)
{
OnCodeScanned(new CodeScannedEventArgs(receivedText));
}
protected void OnCodeScanned(CodeScannedEventArgs e)
{
EventHandler<CodeScannedEventArgs> handler = CodeScanned;
if (handler != null)
{
handler(this, e);
}
}
}
我使用的扫描仪在其扫描的所有内容中都添加了字节02作为前缀,并添加了字节13和10作为后缀,因此我很容易将其分解为单词。 显然,您将需要稍微更改实现,以便它对您有用。
编辑-CodeScannedEventArgs类:
public class CodeScannedEventArgs : EventArgs
{
public CodeScannedEventArgs(string scannedCode)
{
ScannedCode = scannedCode;
}
public string ScannedCode { get; set; }
}
我使用了port.ReadTo(“ \\ r”),它可以正常工作,因为输出以回车结束。
但是我想知道使用数据接收事件有什么好处?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.