有两个按钮,一个是“开启基本数据按钮设为button1”,另一个是“读取ListBox内部
数据的内容“设为button2,设定是先开启button1接收基本数据后才能开启button2接
收ListBox内的数据,接收协议一共有5位,分别是报头,符号位,数据位,数据位,校验位(没有长度位),当开启button1后界面上的基本数据的TextBox值会不断发生变化。
。当点击button2后(会有个“正在发送,请等待5s”的一个winform窗口弹出。当第二
次再次接收到数据后,会把协议转换成数据添加到ListBox中,但问题来了:为什么有时
点击button2后接收到的数据中ListBox的第一行数据有时是0没收到数据,有时候会读
到数???????????????????
我这里button1的基本原理是给控制器发送一个协议,控制器收到后吧几个基本数据的
协议发送给winform窗口并将协议转换为基本数据记录到TextBox内,这时数据是无限
接收的,从而几个基本数据会不断地有变化。button2和button1原理类似都是发送一
个协议而给ListBox发送数据,发送完成后退出窗口,ListBox的所有行的值都变化之后
继续接收button1的基础数据。
接收代码:
int S, A, B, C, D;
private List memory = new List(4096);
private byte[] bufferbyte = new byte[5];
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (Closing) return;
Control.CheckForIllegalCrossThreadCalls = false;
int n = comm.BytesToRead;
Byte[] bytes = new Byte[n];
r_count += n;//记录接收的字节
comm.Read(bytes, 0, n);
try
{
this.Invoke((EventHandler)delegate
{
if (n > 0)
{
#region 协议解析/分析数据
//<协议解析>
bool data_1_catched = false;//缓存记录数据是否捕获到
memory.AddRange(bytes);//缓存数据
while (memory.Count >= 2)//至少要包含头(1字节)+校验(1字节)
{
if (memory[0] == 0x88)
{
if (memory.Count < 5)
break;
//<数据校验>
if ((memory[4] != (memory[1] + memory[2] + memory[3]) % 256) &&
(memory[4] != (memory[1] - 128 + memory[2] + memory[3]) % 256))
{
memory.RemoveRange(0, 5);
continue;
}
memory.CopyTo(0, bufferbyte, 0, 5);
data_1_catched = true;
memory.RemoveRange(0, 5);
//<分析数据>
if (data_1_catched)
{
#region 接收协议定义,用于将协议转化为数据
.............................
#endregion
#region 将基本数据转化并填充到TextBox
.............................
#endregion
#region 将ListBox数据协议转化并填充到ListBox
.............................
#endregion
}
}
});
Button1方法比较简单,就是两句话:
SendData("88", "FF", "01", "01", "01", 10);//是发送协议方法 周期为10ms
comm.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
Button2方法:
private void ReadListBoxData_Click(object sender, EventArgs e)
{
WaitingForm waitf = new WaitingForm();
waitf.ShowIcon = false;
waitf.label1.Text = "正在处理,请稍后......";
waitf.Show();
//如果不加上此句话,新窗体加载的内容都在队列中等待而不会绘制,从而导致新窗体没有内容。加上的话,新窗体会重新绘制
Application.DoEvents();
for (int ti = 0; ti < 4; ti++)
{
SendData("88", "FF", "04", "04", "07", 1000);
}
Thread.Sleep(4000);
if (IsNull(bufferbyte) == true)
{
MessageBox.Show("重复超时,重新读取");
}
waitf.Dispose();
//接受完ListBox的数据后,继续接收基本数据
SendData("88", "FF", "01", "01", "01", 10);//
comm.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
}
最大的问题再说一下,就是ListBox的第一行数据有的时候能收到数有时候收不到数,但是自己通过把数据转化到字符串框之后,发现第一列的协议都没有问题,
怀疑是和之前的基本数据协议的尾端发生冲突了,求解决办法??
现在有一个方法是协商控制器,在发送第一组数据之前添加个5位保护协议。有没有
更好的方法???