一个C#串口通讯的接收异常问题
无语·回忆2016/04/29软件综合 IP:山东
最近为我的一个单片机联机控制作品写上位机,考虑后,选择了C#,我之前一直在学单片机C语言,没接触过Windows编程语言,所以这次也是第一次接触C#,边摸索,边搜索资料边写。串口接收那里遇到了一个奇怪的问题,在网上搜索相关串口通讯程序研究后仍未解决问题,请各位帮忙看看问题出在哪,为了方便查看,我直接贴出故障功能模块的程序

基本意图:2个不同的图片当作指示灯(pictureBox),当串口收到指定数据后(如0X1E),pictureBox3可视,pictureBox4不可视;当串口收到指定数据后(如0X1D),pictureBox3不可视,pictureBox4可视,这样就实现了指示灯变色效果。


故障现象:发送“IE”,分别收到正常的数据“1E”;再次发送,会分别收到1次“1”和1次“E” (数据被分开了)
如果等一会儿(时间挺长)再发送一次,就会从头重复这个过程,如果不等待(间隔短)一直发下去,就一直出现数据被分开的情况

笔者自我排查故障所得:如果将波特率设置为115200,那么程序一切正常,可是设置到其他值都不正常,按说9600的波特率应该也正常才对啊

源代码如下:
<code class="lang-c">using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
         
         
namespace SerialPortTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //display();
        }
         
                
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                foreach (string com in System.IO.Ports.SerialPort.GetPortNames())
                    comboBox1.Items.Add(com);
            }
            catch (Exception er)
            {
                MessageBox.Show("端口加载失败!" + er.Message, "提示");
            }
            comboBox2.SelectedIndex = 4;
            comboBox3.SelectedIndex = 2;
            comboBox4.SelectedIndex = 0;
            comboBox5.SelectedIndex = 1;
           // comboBox1.SelectedIndex = 0;
        }
         
        //打开串口
        private void btnOpen_Click(object sender, EventArgs e)
        {
         
            try
            {
                if (serialPort1.IsOpen)
                { serialPort1.Close(); }
                else
                {
                    serialPort1.BaudRate = int.Parse(comboBox2.Text.Trim());
                    serialPort1.DataBits = int.Parse(comboBox3.Text.Trim());
                    serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), comboBox4.Text.Trim());
                    serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), comboBox5.Text.Trim());
                    serialPort1.PortName = comboBox1.Text;
                    serialPort1.Open();
                      
                }
                groupBox1.Enabled = !serialPort1.IsOpen;
                if (btnOpen.Text == "打开串口")
                {
                    btnOpen.Text = "关闭串口";
                    pictureBox1.Visible = true;
                    pictureBox2.Visible = false;
                }
                else if (btnOpen.Text == "关闭串口")
                {
                    btnOpen.Text = "打开串口";
                    pictureBox1.Visible = false;
                    pictureBox2.Visible = true;
                }
         
                       
         
         
            }
            catch (Exception er)
            {
                MessageBox.Show("串口打开失败!" + er.Message, "提示");
            }
        }
         
         
        private void btnSend_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen == false)
            {
                MessageBox.Show("请先打开串口!");
                return;
            }
            SendData();//发送数据传递textBox1.text中数据
            //display();
        }
         
         
         
        //接收数据
         
        string Recive;  
                
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
                     
            Invoke
             (new EventHandler
               (delegate
               {
                           
                  // textBox2.Text += serialPort1.ReadExisting();  
       
             //这里注释掉,经试验,textBox和Repeat同时接受会互相干扰,出现收到奇怪的数据
       
       
                   Recive = serialPort1.ReadExisting();       
                                              
             
                   if (Recive.Trim() == "1E")
                   {
                       pictureBox3.Visible = true;
                       pictureBox4.Visible = false;
                         
                             
                   }
         
                   MessageBox.Show(Repeat);        //查看当前收到了什么,排查故障用
         
                   if (Recive.Trim() == "1D") 
                   {
                       pictureBox3.Visible = false;
                       pictureBox4.Visible = true;
                        
                              
                   }
         
                   MessageBox.Show(Repeat);       //查看当前收到了什么,排查故障用
         
         
         
               }
               )
              );
        }
         
        //向串口发送数据
        public void SendData()
        {
            for (int i = 0; i < textBox1.Lines.Count(); i++)
            {
                serialPort1.WriteLine(textBox1.Lines<i>);
                                         
            }
        }</i></code>

运行状态:
QQ截图20160429212903.jpg



QQ截图20160429212911.jpg

[修改于 8年8个月前 - 2016/04/29 22:46:15]

来自:计算机科学 / 软件综合
2
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
test100
8年8个月前 IP:广东
817771
miss掉数据,大概就3种原因吧
1 比特率不对
2 干扰
3 单片机太忙
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
mengwei1324
8年8个月前 IP:江苏
817788
byte recive =XXXXXXXXXXXXXXadReadbyte();试试
直接读取字节数据   不转成字符串
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
无语·回忆
进士 机友 笔友
文章
21
回复
584
学术分
0
2012/10/06注册,1个月12天前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}