您的位置:首页 > 编程语言 > C#

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

2011-05-17 10:51 295 查看
之前发的那个帖子是从网上转的,这回亲自写个程序发现了好多问题啊,郁闷



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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: