串口调试助手-发送数据,按字符或16进制显示接收数据的C#程序

http://www.cnblogs.com/liaoshf/p/5894451.html

 

 

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 窗口调试小程序
{
    public partial class Form1 : Form
    {
        SerialPort sp = null;//声明一个串口类
        bool isOpen = false;//打开串口标志位
        bool isSetProperty = false;//属性设置标志位
        bool isHex = false;//十六进制显示标志位

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 串口参数设置
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            this.MaximumSize = this.Size;
            this.MinimumSize = this.Size;
            this.MaximizeBox = false;
            for (int i = 0; i < 10; i++)//最大支持到串口10,可根据自己需求增加
            {
                cbxCOMPort.Items.Add("COM" + (i + 1).ToString());

            }
            cbxCOMPort.SelectedIndex = 0;
            //列出常用的波特率
            cbxBaudRate.Items.Add("1200");
            cbxBaudRate.Items.Add("2400");
            cbxBaudRate.Items.Add("4800");
            cbxBaudRate.Items.Add("9600");
            cbxBaudRate.Items.Add("19200");
            cbxBaudRate.Items.Add("38400");
            cbxBaudRate.Items.Add("43000");
            cbxBaudRate.Items.Add("56000");
            cbxBaudRate.Items.Add("57600");
            cbxBaudRate.Items.Add("115200");
            cbxBaudRate.SelectedIndex = 5;
            //列出停止位
            cbxStopBits.Items.Add("0");
            cbxStopBits.Items.Add("1");
            cbxStopBits.Items.Add("1.5");
            cbxStopBits.Items.Add("2");
            cbxStopBits.SelectedIndex = 1;
            //列出数据位
            cbxDataBits.Items.Add("8");
            cbxDataBits.Items.Add("7");
            cbxDataBits.Items.Add("6");
            cbxDataBits.Items.Add("5");
            cbxDataBits.SelectedIndex = 0;
            //列出奇偶校验位
            cbxParity.Items.Add("无");
            cbxParity.Items.Add("奇校验");
            cbxParity.Items.Add("偶校验");
            cbxParity.SelectedIndex = 0;
            //默认为Char显示
            rbnChar.Checked = true;
          
         
        }

        /// <summary>
        /// 检测哪些串口可用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCheckCom_Click(object sender, EventArgs e)
        {
                          bool comExistence = false;//有可用串口标志位
                cbxCOMPort.Items.Clear();//清除当前串口号中的所有串口名称
                for (int i = 0; i < 10; i++)
                            {
                                try
                                {
                                    SerialPort sp = new SerialPort("COM" + (i + 1).ToString());
                                    sp.Open();
                                    sp.Close();
                                    cbxCOMPort.Items.Add("COM" + (i + 1).ToString());
                                    comExistence = true;

                                }
                                catch (Exception)
                                {
                                    continue;
                                }
                            }
                if (comExistence)
                {
                    cbxCOMPort.SelectedIndex = 0;//使ListBox显示第1个添加的索引
                }
                else
                {
                    MessageBox.Show("没有找到可用串口!", "错误提示");
                }
        }

        /// <summary>
        /// 串口检查按钮:检查串口是否设置
/// </summary>
        private bool CheckPortSetting()
        {
            if (cbxCOMPort.Text.Trim() == "")
                return false;

            if (cbxBaudRate.Text.Trim() == "")
                return false;

            if (cbxDataBits.Text.Trim() == "")
                return false;

            if (cbxParity.Text.Trim() == "")
                return false;

            if (cbxStopBits.Text.Trim() == "")
                return false;

            return true;

        }
        /// <summary>
        /// 检查是否发送数据
        /// </summary>
        /// <returns></returns>
        private bool CheckSendData()
        {
            if (tbxSendData.Text.Trim() == "")
                return false;
            return true;
        }
        /// <summary>
        /// 设置串口的属性:停止位、数据位、奇偶校验位
/// </summary>
        private void SetPortProperty()
        {
            sp = new SerialPort();
            sp.PortName = cbxCOMPort.Text.Trim();//设置串口名
            sp.BaudRate = Convert.ToInt32(cbxBaudRate.Text.Trim());//设置串口的波特率
            float f = Convert.ToSingle(cbxStopBits.Text.Trim());//设置停止位
            if (f == 0)
            {
                sp.StopBits = StopBits.None;
            }
            else if (f == 1.5)
            {
                sp.StopBits = StopBits.OnePointFive;
            }
            else if (f == 1)
            {
                sp.StopBits = StopBits.One;
            }
            else if (f == 2)
            {
                sp.StopBits = StopBits.Two;
            }
            else
            {
                sp.StopBits = StopBits.One;
            }
            sp.DataBits = Convert.ToInt16(cbxDataBits.Text.Trim());//设置数据位
            string s = cbxParity.Text.Trim();//设置奇偶校验位
            if (s.CompareTo("无") == 0)
            {
                sp.Parity = Parity.None;
            }
            else if (s.CompareTo("奇校验") == 0)
            {
                sp.Parity = Parity.Odd;
            }
            else if (s.CompareTo("偶校验") == 0)
            {
                sp.Parity = Parity.Even;
            }
            else
            {
                sp.Parity = Parity.None;
            }

            sp.ReadTimeout = -1;//设置超时读取时间
            sp.RtsEnable = true;
            //定义DataReceived事件,当串口收到数据后触发事件
            sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
            if (rbnHex.Checked)
            {
                isHex = true;
            }
            else
            {
                isHex = false;
            }
        }

        /// <summary>
        /// 发送串口数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSend_Click(object sender, EventArgs e)
        {
            if (isOpen)//写串口数据
            {
                try
                {
                    sp.WriteLine(tbxSendData.Text);
                }
                catch (Exception)
                {
                    MessageBox.Show("发送数据时发生错误!", "错误提示");
                    return;
                }
            }
            else
            {
                MessageBox.Show("串口未打开!", "错误提示");
                return;
            }   
        }

        /// <summary>
        /// 串口状态检测:是否设置、是否占用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpenCom_Click(object sender, EventArgs e)
        {
            if (isOpen == false)
            {
                if (!CheckPortSetting())//检测串口设置
                {
                    MessageBox.Show("串口未设置!", "错误提示");
                    return;
                }


                if (!isSetProperty)//串口未设置则设置串口
                {
                    SetPortProperty();
                    isSetProperty = true;
                }
                try//打开串口
                {
                    sp.Open();
                    isOpen = true;
                    btnOpenCom.Text = "关闭串口";
                    //串口打开后则相关的串口设置按钮便不可再用
                    cbxCOMPort.Enabled = false;
                    cbxBaudRate.Enabled = false;
                    cbxDataBits.Enabled = false;
                    cbxParity.Enabled = false;
                    cbxStopBits.Enabled = false;
                    rbnChar.Enabled = false;
                    rbnHex.Enabled = false;
                }
                catch (Exception)
                {
                    //打开串口失败后,相应标志位取消
                    isSetProperty = false;
                    isOpen = false;
                    MessageBox.Show("串口无效或已被占用!", "错误提示");
                }
            }
            else
            {
                try//打开串口
                {
                    sp.Close();

                    isOpen = false;
                    isSetProperty = false;
                    btnOpenCom.Text = "打开串口";
                    //关闭串口后,串口设置选项便可以继续使用
                    cbxCOMPort.Enabled = true;
                    cbxBaudRate.Enabled = true;
                    cbxDataBits.Enabled = true;
                    cbxParity.Enabled = true;
                    cbxStopBits.Enabled = true;
                    rbnChar.Enabled = true;
                    rbnHex.Enabled = true;
                }
                catch (Exception)
                {
                    lblStatus.Text = "关闭串口时发生错误";
                }
            }
        }
private void sp_DataReceived(object sender,SerialDataReceivedEventArgs e)
    {
                    System.Threading.Thread.Sleep(100);//延时100ms等待接收完数据

            // this.Invoke就是跨线程访问ui的方法

            this.Invoke((EventHandler)(delegate
                    {
                        if(isHex==false)
                        {
                            tbxRecvData.Text+=sp.ReadLine();
                        }
                        else
                        {
                           Byte[] ReceivedData=new Byte[sp.BytesToRead];
                            sp.Read(ReceivedData,0,ReceivedData.Length);
                            String RecvDataText=null;
                            for(int i=0;i<ReceivedData.Length-1;i++)
                            {
                                RecvDataText+=("0x"+ReceivedData[i].ToString("X2")+"");
                            }
                            tbxRecvData.Text+=RecvDataText;
                        }
                        sp.DiscardInBuffer();//丢弃接收缓冲区数据
             }));
    }
private void btnCleanData_Click(object sender,EventArgs e)
        {
            tbxRecvData.Text="";
            tbxSendData.Text="";
        }

       
         
    }
}

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的51单片机串口程序,包括字符16进制数据的发送和接收: ```c #include <reg51.h> #include <stdio.h> #define BAUDRATE 9600 // 定义波特率为9600bps #define FOSC 11059200 // 定义系统时钟频率为11.0592MHz sbit LED = P0^0; // 定义P0.0为LED输出口 void initUART() { TMOD |= 0x20; // 设置定时器1为模式2 TH1 = 256 - FOSC/32/BAUDRATE; // 设置波特率计数初值 TL1 = TH1; // 初始化定时器1 TR1 = 1; // 启动定时器1 SCON = 0x50; // 设置串口为模式1,允许接收 ES = 1; // 允许串口中断 EA = 1; // 允许总中断 } void sendChar(char ch) { SBUF = ch; // 将字符放入串口发送缓冲区 while(!TI); // 等待发送完成 TI = 0; // 清除发送完成标志 } void sendStr(char *str) { while(*str) { sendChar(*str++); // 逐个发送字符 } } void sendHex(unsigned char hex) { char hexStr[3]; sprintf(hexStr, "%02X", hex); // 将16进制换成字符串 sendStr(hexStr); // 发送字符串 } void main() { initUART(); // 初始化串口 while(1) { if(RI) // 如果接收到数据 { char ch = SBUF; // 读取接收到的数据 RI = 0; // 清除接收标志 sendChar(ch); // 将数据回传 } LED = ~LED; // 翻LED状态 sendStr("Hello World!\r\n"); // 发送字符串 sendHex(0xAB); // 发送16进制数据 sendChar('\r'); sendChar('\n'); for(int i=0;i<10000;i++); // 稍微延时一下 } } void UART_ISR() interrupt 4 { if(RI) // 如果接收到数据 { char ch = SBUF; // 读取接收到的数据 RI = 0; // 清除接收标志 sendChar(ch); // 将数据回传 } } ``` 在这个程序中,我们使用定时器1来生成波特率,通过设定TH1和TL1的值来控制波特率。串口中断服务例程(UART_ISR)用于接收数据,并将接收到的数据回传。 sendChar函数用于发送一个单个字符,sendStr函数用于发送一个字符串,sendHex函数用于发送16进制数据。在主循环中,我们发送了一个Hello World的字符串和一个0xAB的16进制数据,并翻了LED的状态。 请注意,在使用串口时,必须要设置波特率、数据位、停止位和校验位等参数,否则通信会出现错误。此外,如果发送的数据量过大,必须使用缓冲区来存储数据,以免数据丢失。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值