WEB开发网
开发学院软件开发C语言 C#串口编程遇到的问题以及解决方法 阅读

C#串口编程遇到的问题以及解决方法

 2010-09-30 22:43:16 来源:WEB开发网   
核心提示:最近在做的项目中涉及到串口通信编程,队友在做这一模块的时候遇到了一个相信很多人都可能遇到的问题,C#串口编程遇到的问题以及解决方法,那就是接受数据的冲突或者丢失,队友让我帮他调试的时候,如下所示: 7E 09 01 1A 5C 00 00 00 00 00 00 00 00 00 00 /// 03 06 1A 2C

最近在做的项目中涉及到串口通信编程,队友在做这一模块的时候遇到了一个相信很多人都可能遇到的问题,那就是接受数据的冲突或者丢失。队友让我帮他调试的时候,足足花了近两个小时才把问题给解决了,现觉得有必要总结一下以给遇到类似问题的朋友一个思路吧~

问题是这样的,从相应的硬件设备每隔2秒便发送一个大小为15的字节数据,存的是16进制数据,每条数据以7E开头以7E结尾。例如:7E 09 01 1A ... 7E。但是PC端在接受显示的时候却出现了问题,如前五个数据接受正常,接下来的都是以00填充,而剩下的10个数据却出现在下条数据显示的位置。如下所示:

7E 09 01 1A 5C 00 00 00 00 00 00 00 00 00 00 /////// 03 06 1A 2C 3D 09 6C 32 12 7E 00 00 00 00 00 00/////// ........

总之感觉错位了,对了,先把PC端代码贴一下吧:     

public partial class Form1 : Form
    {
        /// <summary>
        /// 接受数据的串口类 
        /// </summary>
        SerialPort spReceive;
        delegate void ReceivData(byte[] bytes);
        public Form1()
        {
            Form1.CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
          
            spReceive =new SerialPort("COM5", 57600, Parity.None, 8, StopBits.One);             
            spReceive.Open();
            
            //设置触发DataReceived事件的阀值,在调试中发现这个不起作用,不解~      
            spReceive.ReceivedBytesThreshold =15;            
            spReceive.DataReceived +=new System.IO.Ports.SerialDataReceivedEventHandler(spReceive_DataReceived);            
        }
        /// <summary>
        /// 更新接受到得数据到UI界面显示
        /// </summary>
        /// <param name="bytes"></param>
        public void UpdateReceiveToUI(byte[] bytes)
        {
            if (txtReceive.InvokeRequired)
            {
                ReceivData dl = new ReceivData(UpdateReceiveToUI);
                object arg = bytes;
                txtReceive.Invoke(dl, arg);
            }
            else
                txtReceive.Text += "/////////" + BitConverter.ToString(bytes);
        }
        /// <summary>
        /// 接收到串口数据触发的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void spReceive_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            byte[] recevied = new byte[15];
            int size = spReceive.Read(recevied, 0, recevied.Length);
            if (size >0)
                UpdateReceiveToUI(recevied);
            
        }
    }

1 2  下一页

Tags:串口 编程 遇到

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接