KyKiske22 2015-06-19 02:21 采纳率: 0%
浏览 781

求助 ,关于C# winform窗体串口在读取一组参数后再一次读取另一组参数的问题

有两个按钮,一个是“开启基本数据按钮设为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位保护协议。有没有
更好的方法???

  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥15 怎么获取下面的: glove_word2id.json和 glove_numpy.npy 这两个文件
    • ¥15 js调用html页面需要隐藏某个按钮
    • ¥15 ads仿真结果在圆图上是怎么读数的
    • ¥20 Cotex M3的调试和程序执行方式是什么样的?
    • ¥20 java项目连接sqlserver时报ssl相关错误
    • ¥15 一道python难题3
    • ¥15 牛顿斯科特系数表表示
    • ¥15 arduino 步进电机
    • ¥20 程序进入HardFault_Handler
    • ¥15 oracle集群安装出bug