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;
}
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;
}
相关文章推荐
- C#串口操作实际应用开发详解
- ARM裸机程序开发21(2440串口:申嵌源码2440lib.c文件中关于UART的操作)
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- [C# 开发技巧系列]使用C#操作Word和Excel程序
- C#串口操作实际应用开发详解
- C#串口操作实际应用开发详解
- 用C#开发串口控制程序
- 用C#开发串口控制程序
- [C# 开发技巧系列]使用C#操作Word和Excel程序
- c#.net网络程序开发-socket篇 _c#应用
- 创建C#串口通信程序详解(转自:http://www.csharpwin.com/csharpspace/5544r7857.shtml)
- C#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁
- C# WinForm程序对AD操作
- 使用C#和Excel进行报表开发(二)-操作统计图(Chart)
- C#程序开发中经常遇到的10条实用的代码
- c#的串口控件操作
- C# 串口操作系列(3) -- 协议篇,二进制协议数据解析
- 微信小程序开发填坑,优雅地处理用户的误操作引起的多次请求
- 使用Assembly来开发c#程序
- C#开发程序登录界面用户名和密码的验证