最近采用C#串口编程遇到一个问题:一个测试数据怎么拆分成2个字符串,做了2次发送,屏幕显示的字符总是少了几位,
输出的数据是这样的:
2013-06-26 09:38:29 XR1000229E-2,GO
2013-06-26 09:39:20 XR1000244E-
2013-06-26 09:39:20 2,GO
2013-06-26 09:39:27 XR1000244E-2,GO
2013-06-26 09:39:29 XR1000250E-2,GO
2013-06-26 09:39:34 XR1000242E-2,GO
2013-06-26 09:39:34
2013-06-26 09:39:36 XR1000240E-2,GO
2013-06-26 09:39:38 XR1000242E-2,GO
2013-06-26 09:39:39 XR100024
2013-06-26 09:39:39 7E-2,GO
2013-06-26 09:39:41 XR100
2013-06-26 09:39:41 0252E-2,GO
原来的代码设计:
private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Invoke(new MethodInvoker(delegate()
{
int N = this.sp.BytesToRead;
byte[] RecieveBuf = new byte[N];
this.sp.Read(RecieveBuf, 0, N);
string strRecieve3 = System.Text.Encoding.Default.GetString(RecieveBuf);
this.txtValue.Text = strShow;
}));
}
分析:发送E后,等待内存缓冲是否够“XR0001095E+1,LO”字符,如果接收的长度正确,才输出结果,否则等待继续接收,也就是第二次的接收。
改善后的代码:
* 接受串口数据并存储
* *************************************/
private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Invoke(new MethodInvoker(delegate()
{
int N = this.sp.BytesToRead;
byte[] RecieveBuf = new byte[N];
this.sp.Read(RecieveBuf, 0, N);
lock (list_lock)
{
list_byteArray.Add(RecieveBuf);
}
WriteLog();
}));
}
* 将接收的数据写入 日志
* ************************************/
public void WriteLog()
{
if (list_byteArray.Count > 0)
{
lock (list_lock)
{
byte[] RecieveBuf = (byte[])list_byteArray[0];
str_recieveData += System.Text.Encoding.Default.GetString(RecieveBuf);
if (str_recieveData.IndexOf("\0\n") > -1)
{
string[] arr = System.Text.RegularExpressions.Regex.Split(str_recieveData, "\0\n");
string frame = arr[arr.Length - 2];
if (frame.Length == 15)
{
//this.txtValue.Text = frame;
str_recieveData = "";
txtValue.Text = GetSubTestValue(frame);
int iIndex = frame.LastIndexOf(',');
txtResult.Text = frame.Substring(iIndex + 1, 2);
}
else if (frame.Length < 15)
{
str_recieveData = frame;
}
}
//移除已经读到的数据
list_byteArray.RemoveAt(0);
}
}
}