C#串口通讯。主窗口中添加了个串口控件,mySerialPort mysp,在主窗口LOAD的时候初始化,并打开了串口。

作者&投稿:饶功 (若有异议请与网页底部的电邮联系)
C# Form1窗体中存在Serialport 在load时打开,在Form2中也存在Serialport在加载是open就会报错~

基本原理:
一、线程实时读串口;
二、事件触发方式实现。
由于线程实时读串口的效率不是十分高效,因此比较好的方法是事件触发的方式。
在SerialPort类中有DataReceived事件,当串口的读缓存有数据到达时则触发DataReceived事件,
SerialPort.ReceivedBytesThreshold属性决定了当串口读缓存中数据多少个时才触发DataReceived事件,默认为1。

另外,SerialPort.DataReceived事件运行比较特殊,其运行在辅线程,不能与主线程中的显示数据控件直接进行数据传输,必须用间接的方式实现。


放多几个serialPort就OK啦~serialPort自动多线程的 , 不用做并发操作处理的吗?如果是这样就再好不过了

多个串口,最好用多线程,这样比较方便 也可以在一个线程中,一个一个读串口数据!

你有几个Com 口,不多的话就多放几个SerialPort 控件上去,分别指定不同的Com口,接受数据的话它本身有一个事件,有数据后自动触发。

SerialPort类读取数据的许多方法是同步阻塞调用,尽量避免在主线程中调用,可以使用异步处理或线程间处理调用这些读取数据的方法。
由于DataReceived事件在辅线程被引发,当收到完整的一条数据,返回主线程处理或在窗体上显示时,请注意跨线程的处理,C#可采用控件异步委托的方法Control.BeginInvoke及同步委托的方法Invoke。

本文主要是讲述如何通过C# .net1.1平台调用API操作串口,.net2.0已经内置串口操作类!

通常,在C#中实现串口通信,我们有四种方法:

第一:通过MSCOMM控件这是最简单的,最方便的方法。可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册。可以访问一个外国人写的教程
第二:微软在.NET新推出了一个串口控件,基于.NET的P/Invoke调用方法实现,详细的可以访问微软网站
Serial Comm
Use P/Invoke to Develop a .NET Base Class Library for Serial Device Communications
第三:就是用第三方控件啦,可一般都要付费的,不太合实际,何况楼主不喜欢,不作考虑
第四:自己用API写串口通信,这样难度高点,但对于我们来说,可以方便实现自己想要的各种功能。

我们采用第四种方法来实现串口通信,用现成的已经封装好的类库,常见两个串口操作类是JustinIO和SerialStreamReader。介绍JustinIO的使用方法:

打开串口:

函数原型:public void Open()

说明:打开事先设置好的端口

示例:


[csharp] view plaincopyprint?using JustinIO;

static JustinIO.CommPort ss_port = new JustinIO.CommPort();
ss_port.PortNum = COM1; //端口号
ss_port.BaudRate = 19200; //串口通信波特率
ss_port.ByteSize = 8; //数据位
ss_port.Parity = 0; //奇偶校验
ss_port.StopBits = 1;//停止位
ss_port.ReadTimeout = 1000; //读超时
try
{
if (ss_port.Opened)
{
ss_port.Close();
ss_port.Open(); //打开串口
}
else
{
ss_port.Open();//打开串口
}
return true;
}
catch(Exception e)
{
MessageBox.Show("错误:" + e.Message);
return false;
}

我刚才特意写了个demo进行测试,你所说的这种要求是完全可以的.
我把一些关键部分的代码贴出来好了.
//-------------------------------------------------------------
//窗体1有serialPort1对象.
//按钮点击事件函数
private void button2_Click(object sender, EventArgs e)
{
serialPort1.BaudRate = 9600;
serialPort1.Parity = System.IO.Ports.Parity.None;
serialPort1.PortName = "COM1";
serialPort1.Open();
}
//打开form2的函数
private void button1_Click(object sender, EventArgs e)
{
using (Form2 form2 =new Form2 ())
{
form2.serialport = serialPort1;
form2.ShowDialog();
}
}
//form2里的关键代码
public SerialPort serialport { get; set; }
//点击form2中的按钮后关闭串口对象
private void button1_Click(object sender, EventArgs e)
{
serialport.Close();
this.DialogResult = System.Windows.Forms.DialogResult.OK;
}

把第一个界面的串口控件 当成参数传给 你的第二个窗体就可以了 你可以通过修改第二个窗体的构造函数 实现

楼主我碰到跟你一样的问题,你是怎么解决的啊


余杭区18075981166: 请问,使用C#编写界面,Form1作为主窗口,点击按钮进入串口设置2,怎么在窗口1中调用2中定义的串口? -
茶欣橘红: 把声明改成static

余杭区18075981166: 如何c#串口api添加到主窗口 -
茶欣橘红: 本文主要是讲述如何通过C# .net1.1平台调用API操作串口,.net2.0已经内置串口操作类!通常,在C#中实现串口通信,我们有四种方法:第一:通过MSCOMM控件这是最简单的,最方便的方法.可功能上很难做到控制自如,同时这个控件并不...

余杭区18075981166: 在C#中怎样实现串口通讯接受数据 -
茶欣橘红: C#实现串口通讯你肯定得用到SerialPort,打开串口连接后,绑定DataReceived事件就能接收数据

余杭区18075981166: C#编程实现串口通讯例程
茶欣橘红: private void button1_Click(object sender, EventArgs e){serialPort1.PortName = "COM1";serialPort1.BaudRate = 9600;serialPort1.Open();byte[] data = Encoding.Unicode.GetBytes(textBox1.Text);string str = Convert.ToBase64String(data);...

余杭区18075981166: 如何在C#下实现串口通信?求详解~ -
茶欣橘红: System.IO.Ports命名空间下有一个专门用来访问串口的类SerialPort.SerialPort port = new SerialPort();// 设置串口参数,必须与对端的参数相同 port.PortName = "COM1"; // 串口名称 port.BaudRate = 2400; // 波特率 port.DataBits = 7; ...

余杭区18075981166: C#串口通讯完整例程 -
茶欣橘红: C#串口操作之读取串口数据: try { axMSComm2.CommPort = 1i; axMSComm2.InputMode = MSCommLib.InputModeConstants.comInputModeBinary; //用于设置或返回传输数据的类型, //此例程是通过Input属性以二进制方式检取回数据 ...

余杭区18075981166: C# winforms 有2个串口(A是正规串口,B是USB转串口),serialPort,将2个串口进行通信,拔掉B,出现异常 -
茶欣橘红: 因为A是正规串口,你就算不插东西,那个串口也是存在的,而B是USB转的串口,你的USB没插上去的时候,2号串口是不存在的,不信你可以右键属性,设备管理,可以看到你电脑的串口,你拔掉A串口是不会有问题,但是B一拔掉,这个串口就没有了,所以...

余杭区18075981166: 在c#的web中怎样实现与串口通讯 -
茶欣橘红: 使用使用serialport这个类,可以在DataReceived事件中作处理.也可以直接使用Read、和Write函数对串口进行操作.

余杭区18075981166: C# 串口不同窗体的调用 -
茶欣橘红: 你可以这样设计,FORM2里面仅只是发出串口参数设置,打开的指令.实际的串口属于FORM1主窗体,然后FORM3里面就是发送和接收.通过属性来控制串口工作.具体的可以参考窗口传值.

余杭区18075981166: C#多串口通信,线程? -
茶欣橘红: 多串口跟线程没有直接的关系,如果你要做一个软件针对多个串口设备的话需要多个计算机的COM口,这样软件中可以创建多个serialport实例,每个serialport针对一个COM口操作,每个serialport的Data...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网