c#开发串口操作程序-续

之前发的那个帖子是从网上转的,这回亲自写个程序发现了好多问题啊,郁闷

 

SerialPort serialPort1 = new SerialPort();

 

serialPort1.PortName = "COM3";

 

serialPort1.BaudRate = 2400;

 

serialPort1.StopBits = StopBits.One;//获取或设置每个字节的标准停止位数

 

serialPort1.Parity = 0;//获取或设置奇偶校验检查协议

 

serialPort1.Open();

 

 

 

1 串口收程序发的数据

 

serialPort1.WriteLine(textBox1.Text);

 

在按钮里写上 这句话就好使了,串口能很好的收到程序发的数据

 

 

2 程序收串口发的程序//这个跟之前发的帖子里不一样

 

之前帖子里用的是serialPort1.ReadLine();这句话 会使程序一直在读取串口,我不太会使;

 

改为用serialPort1.Read();//这个方法要配上线程使用

 

--------------------------------------------------------------------

public delegate void CANHandler(string param);//建了个委托

 

private static CANHandler onCAN;//委托

 

 public event CANHandler GetCAN//一个事件
{
        add { onCAN += new CANHandler(value); }
        remove { onCAN -= new CANHandler(value); }
}

 

public SerialPort serialPort1;

public Thread thread1;

 

public byte[] ds;

StringBuilder sb;

 

public Form1()
{
           InitializeComponent();

//----------------------------------------------------------------串口


            serialPort1 = new SerialPort();

            serialPort1.PortName = "COM3";

            serialPort1.BaudRate = 2400;

            serialPort1.Open();

            serialPort1.StopBits = StopBits.One;

            serialPort1.Parity = 0;

 

 

            ds = new byte[1024];
            sb = new StringBuilder();

 

//----------------------------------------------------------------线程

            thread1 = new Thread(new ThreadStart(CS));
            thread1.Start();
            this.GetCAN += this.OnCANRead;


}

 

 private void CS()//线程方法
{

            int l = 0, i = 0;

            while (1 == 1)
            {
               
                i = 0;
                Thread.Sleep(1000);


                l = serialPort1.BytesToRead;//获取 串口中发了几位数据


                if (l > 0)//去掉 StringBuilder  中上次获取的值------既while一次是线程的一次读取
                {
                    sb.Remove(0, sb.Length);
                }


                while (i < l)//循环去读取 串口中的数据  因为每次读取的只是串口发来数据的第一位
                {
                   
                    int len = serialPort1.Read(ds, 0, 1024);

                    sb.Append(Encoding.ASCII.GetString(ds, 0, len));//StringBuilder  把数组拼成字符串

                    i += len;

                }


                onCAN(sb.ToString());


            }

}

 

private void OnCANRead(string param)//上面写的线程会不断给这个方法传值,所以操作写在这里
{
            th_evn = param;
            object[] pList = { this, System.EventArgs.Empty };
           
            //textBox1.BeginInvoke(new System.EventHandler(UpdateUI), pList);//这两行是还切换线程的,这样就可以给当前线程的控件传值了           
            label1.BeginInvoke(new System.EventHandler(UpdateUI), pList);//这两行是还切换线程的,这样就可以给当前线程的控件传值了          
}


//切换线程
private void UpdateUI(object o, System.EventArgs e)
{
            label1.Text = th_evn;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值