c#用serialport进行的串口数据接收,遇到了问题,求大神指点

运行后再richtextbox1中只显示一个数,例如:33
随后会报错:对象未引用到对象的实例,点了关闭后又会出现一个数据,例如31,之后又会报错,如此循环,而且数据不太对。
整了好久了,希望能帮帮忙,第一次做这,谢谢!!
代码:

namespace yfy_串口调试
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/****************************设置变量******************************/
public string[] strArray;
public SerialPort sp1 = new SerialPort();
public Byte[] mydata;
public int mydatalength; //这个数的值是由接收到的字节长度决定的,并且作为mydata的长度,如果索引值还超过数组定义值,就应该是接收问题。
public int zhengfu = 2, now_x = 30;
public static Bitmap bmp = new Bitmap(500,350);
public Graphics gph = Graphics.FromImage(bmp);
public char name_image='A';
/*****************************相关函数****************************/

    public void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)//数据接收函数
    {
        if (sp1.IsOpen==true )                                              //为了严谨性,加上检查串口是否被打开
        {
            if (rbRcv16.Checked == true)                                      //接收16进制按钮
            {
                try
                {
                    int average_speed = 0;                                  //设置初始平均速度
                    Byte[] receivedData = new Byte[sp1.BytesToRead];        //创建接收字节数组  
                    sp1.Read(receivedData, 0, receivedData.Length);         //读取数据   
                    sp1.DiscardInBuffer();                                  //清空SerialPort控件的Buffer  
                    mydatalength = receivedData.Length;
                    for (int i = 0; i < receivedData.Length; i++) //窗体显示  
                    {
                        richTextBox1.Text = receivedData[i].ToString("X2");  //16进制显示在接受栏
                        mydata[i] = receivedData[i];
                        richTextBox1.Text += ",";    //让每个数据都隔开
                        average_speed += receivedData[i];
                    }
                    textBox1.Text = (average_speed / receivedData.Length).ToString("X2");

                }
                catch (System.Exception ex)
                 {
                     MessageBox.Show(ex.Message, "出错提示");
                 }

            }
        }
        else
        {
            MessageBox.Show("请打开某个串口或者没有选中16进制接收", "错误提示");
        }
    }
    private void Form1_Load(object sender, EventArgs e)//页面初始化
    {

        Control.CheckForIllegalCrossThreadCalls = false;    //强制不检查线程 
        sp1.DataReceived += new SerialDataReceivedEventHandler(sp1_DataReceived); //订阅委托 
        sp1.ReceivedBytesThreshold =1;   //当缓冲区的字节数为x时,触发datareceive事件

        //检查是否有串口
        string[] str = SerialPort.GetPortNames();
        if (str == null)
        {
            MessageBox.Show("本机没有串口!", "Error!");
            return;
        }

        //添加串口项目
        foreach (string s in System.IO.Ports.SerialPort.GetPortNames())
        {
            cbSerial.Items.Add(s);  //获取有COM口  
        }
        rbRcv16.Checked = true;  //接收数据按16进制进行
    }

    private void btnSwitch_Click(object sender, EventArgs e)//设置串口
    {

        if (sp1.IsOpen == false)
        {
            try
            {
                string serialName = cbSerial.SelectedItem.ToString();//读取串口号
                sp1.PortName = serialName;  //设置串口号 
                sp1.BaudRate = 9600;       //波特率  
                sp1.DataBits = 8;       //数据位  
                sp1.StopBits = StopBits.One;  //停止位
                sp1.Parity = Parity.None;   //校验位

                sp1.Open();     //打开串口    
                btnSwitch.Text = "关闭串口";
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("Error:" + ex.Message, "Error");
                return;
            }
        }
        else
        {
            sp1.Close();    //关闭串口  
            btnSwitch.Text = "打开串口";
        }
    }

2个回答

                    richTextBox1.Text = receivedData[i].ToString("X2");  //16进制显示在接受栏
                    mydata[i] = receivedData[i];
                    richTextBox1.Text += ",";    //让每个数据都隔开
                    average_speed += receivedData[i];

不太对。第一句:richTextBox1的内容由receivedData[i]决定,第三句加了个“,”,但一走for循环,richTextBox1的内容就全部被重置了。
第一句应当改为:

  richTextBox1.Text += receivedData[i].ToString("X2") + “,”;

第三句删掉。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐