首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

serialPort 收不到数据,该怎么解决

2013-05-02 
serialPort 收不到数据using Systemusing System.Collections.Genericusing System.ComponentModelusin

serialPort 收不到数据


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;

namespace People_s_Hospital
{
    public partial class Home : Form
    {
        
        public Home()
        {
            
            InitializeComponent();
        }

        #region 打开关闭串口
        /// <summary>
        /// 打开串口
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Openbutton_Click(object sender, EventArgs e)
        {
            LinkserialPort.Close();
            try
            {
                if (!LinkserialPort.IsOpen)
                {
                    com_State();
                }
                else
                {
                    MessageBox.Show("您已经开始采集数据了!", "错误提示",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        /// <summary>
        /// 关闭串口
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Stopbutton_Click(object sender, EventArgs e)
        {
            if (LinkserialPort.IsOpen)


            {
                this.Selsetimer.Enabled = false;

                this.LinkserialPort.Close();
                string WorkState;
                if (LinkserialPort.IsOpen == false)
                    WorkState = "已经停止";
                else
                    WorkState = "正在进行";
                this.AcquisitionState.Text = "采集状态: " + WorkState;
            }
            else
            {
                MessageBox.Show("您还没有开始采集数据!", "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }

        }
        #endregion

        private void com_State()
        {
                LinkserialPort.BaudRate = Convert.ToInt32(BaudcomboBox.Text);//波特率
                LinkserialPort.DataBits = 8;//数据位
                LinkserialPort.StopBits = StopBits.One;//停止位
                LinkserialPort.Parity = Parity.Space;///校验位
                LinkserialPort.Open();           
                this.LinkserialPort.DataReceived+=new SerialDataReceivedEventHandler(LinkserialPort_DataReceived);
        }

        private void LinkserialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {

            byte[] buffer = new byte[LinkserialPort.BytesToRead];
            CheckForIllegalCrossThreadCalls = false;
            LinkserialPort.Read(buffer, 0, buffer.Length);
            for (int i = 0; i < buffer.Length; i++)
            {
                this.richTextBox1.Text += buffer[i].ToString("X2") + " ";


             }

            很多时候BytesToRead为0,然后就是2, 总是 3F 3F ,收不到数据, 大家帮忙阿,第一次搞这咚咚, 网上很多方法都不行,郁闷

        }

        
    }
}

[解决办法]
单步调试看看
[解决办法]
找个串口调试的工具,看看是程序有问题,还是串口确实没有收到数据
[解决办法]
弄个工具先测试你的串口是不是能的。

[解决办法]
错误的标识是校验位出错应该,你发送不应该是只有SPACE =0,发送地址应该是MARK= 1,然后发送数据再转换为SPACE,不然下位机没办法判断,难道说下位机不用校验位的,就你发送space就可以?
[解决办法]
没有设置串口的名称,如:LinkserialPort.Name = "COM3";LinkserialPort_DataReceived事件是运行在辅线程的,直接与UI交互会出错的。
 /*
                 * SerialPort.DataReceived事件运行比较特殊,其运行在辅线程,不能与主线程中的显示数据控件直接进行数据传输,
                 * 如果要与主线程中的显示数据控件直接进行数据传输必须采用创建主线程的异步方法进行数据传输
                 */
[解决办法]
这个问题和硬件、通信,有很大关系,不一定仅仅是考虑软件。
想问下楼主:你的是PC to PC的?还是MCU to PC?如果是后者,问题解决要麻烦些,需要硬件人员密切配合你调试。
建议:重点检查波特率设置,甚至搬个示波器来确认!
另外,找个“成品”来做通讯的一端,进行调试,可以简化问题。
[解决办法]
加个时间暂停下,然后判断是否接受完成,如果没有接收完成的话,继续接收,如果在一定时间(自己设置时间长度)内没有接收完成,则超时判断

热点排行