关于C#串口通讯问题!

之前在网上看到大神用C#写了一个串口调试助手,自己也试了一下,就是发送的时候是对的(我设置的是16进制),但是接收到的和用串口程序接收到的不一样(我也是想接收16进制的数)请大神帮助看下~
[img=http://img.bbs.csdn.net/upload/201707/09/1499563146_195881.jpg][/img][img=http://img.bbs.csdn.net/upload/201707/09/1499563184_684768.png][/img]
发送A5 50时收到:
          自己写的:3F3F3F3F3F3F043F3F0102C73F3FC13F839EF23FE69EF71F3F3D3F
串口调试助手的:A55A140000000424140102C7D296C1E8839EF2C0E69EF71F653D05
发送A5 52时收到:
           自己写的:3F3F3F3F3F3F3F3F3F3F
串口调试助手的:A55A0300000006000000
发送A5 59时收到:
          自己写的:3F3F043F3F3F15F2013F3F
串口调试助手的:A55A0400000015F201F900
[code=csharp]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 csharp串口通讯
{
    public partial class Form1 : Form
    {
        SerialPort sp1;


        public Form1()
        {
            InitializeComponent();


            this.FormClosed += new FormClosedEventHandler(Form1_FormClosed);


            if (sp1 == null)
            {
                Control.CheckForIllegalCrossThreadCalls = false;    //这个类中我们不检查跨线程的调用是否合法(因为.net 2.0以后加强了安全机制,,不允许在winform中直接跨线程访问控件的属性)               
                sp1 = new SerialPort("COM8", 115200);
                sp1.StopBits = StopBits.One;//
                sp1.DataBits = 8;//
                sp1.Parity = Parity.Even;//设置串口属性
                sp1.Open();
                sp1.DataReceived += new SerialDataReceivedEventHandler(sp1_DataReceived);
                
            }
        }


        void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (sp1 != null && sp1.IsOpen)
            {
                sp1.Close();
            }
        }
///这一部分是发送部分,即在文本框中输入内容后,点击发送按钮,里面包含把内容转化为16进制,这部分应该是对的
        private void btnSend_Click(object sender, EventArgs e)
        {
            if (!sp1.IsOpen) //如果没打开
            {
                MessageBox.Show("请先打开串口!", "Error");
                return;
            }


            String strSend = txtSend.Text;
                //处理数字转换
                string sendBuf = strSend;
                string sendnoNull = sendBuf.Trim();
                string sendNOComma = sendnoNull.Replace(',', ' ');    //去掉英文逗号
                string sendNOComma1 = sendNOComma.Replace(',', ' '); //去掉中文逗号
                string strSendNoComma2 = sendNOComma1.Replace("0x", "");   //去掉0x
                strSendNoComma2.Replace("0X", "");   //去掉0X
                string[] strArray = strSendNoComma2.Split(' ');


                int byteBufferLength = strArray.Length;
                for (int i = 0; i < strArray.Length; i++ )
                {
                    if (strArray[i]=="")
                    {
                        byteBufferLength--;
                    }
                }               
               // int temp = 0;
                byte[] byteBuffer = new byte[byteBufferLength];
                int ii = 0;
                for (int i = 0; i < strArray.Length; i++)        //对获取的字符做相加运算
                {
                  
                    Byte[] bytesOfStr = Encoding.Default.GetBytes(strArray[i]);
                    
                    int decNum = 0;
                    if (strArray[i] == "")
                    {
                        //ii--;     //加上此句是错误的,下面的continue以延缓了一个ii,不与i同步
                        continue;
                    }
                    else
                    {
                         decNum = Convert.ToInt32(strArray[i], 16); //atrArray[i] == 12时,temp == 18 
                    }
                           
                   try    //防止输错,使其只能输入一个字节的字符
                   {
                       byteBuffer[ii] = Convert.ToByte(decNum);        
                   }
                   catch (System.Exception ex)
                   {
                       MessageBox.Show("字节越界,请逐个字节输入!", "Error");
                       return;
                   }


                   ii++;    
                }
                sp1.Write(byteBuffer, 0, byteBuffer.Length);           
        }
///这部分是接收部分,即在大框中显示串口接收到的数据,可能是这一块出问题,接收解析成16进制数字时出错,对比见前面的图片!!!!!
        void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (sp1.IsOpen)     //此处可能没有必要判断是否打开串口,但为了严谨性,我还是加上了
            {
                //输出当前时间
                DateTime dt = DateTime.Now;
                txtReceive.Text += dt.GetDateTimeFormats('f')[0].ToString() + "\r\n";
                txtReceive.SelectAll();
                txtReceive.SelectionColor = Color.Blue;         //改变字体的颜色


                byte[] byteRead = new byte[sp1.BytesToRead];    //BytesToRead:sp1接收的字符个数
                    try
                    {
                        Byte[] receivedData = new Byte[sp1.BytesToRead];        //创建接收字节数组
                        sp1.Read(receivedData, 0, receivedData.Length);         //读取数据
                        //string text = sp1.Read();   //Encoding.ASCII.GetString(receivedData);
                        sp1.DiscardInBuffer();                                  //清空SerialPort控件的Buffer                     
                        string strRcv = null;
                        //int decNum = 0;//存储十进制
                        for (int i = 0; i < receivedData.Length; i++) //窗体显示
                        {


                            strRcv += receivedData[i].ToString("X2");  //16进制显示
                        }
                        txtReceive.Text += strRcv + "\r\n";
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show(ex.Message, "出错提示");
                        txtSend.Text = "";
                    }
                }
            }
           
        }  
    }


[/code]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值