VS编程,C#串⼝通讯,通过串⼝读取数据的⼀种⽅法⼀、可能需要的软件:
1、虚拟串⼝vspd(Virtual Serial Port Driver,⽤来在电脑上虚拟出⼀对串⼝,模拟通讯。
2、友善串⼝调试助⼿,⽤来发送、读取数据。
⼆、思路
1、查询本机所有的串⼝
2、判断需要的串⼝是否存在本机的串⼝中
3、设置串⼝的参数,如波特率、奇偶校验等。
4、打开串⼝,
5、通过串⼝读取数据,处理数据
6、关闭当前窗⼝时,将串⼝⼀并关闭。
7、可以写⼀个定时器,来循环执⾏1、2两步,并判断串⼝是否打开,以保持串⼝通讯正常。
三,代码
1、查询本机所有的串⼝
///<summary>
///获取本机串⼝列表
///</summary>
///<param name="isUseReg"></param>
///<returns></returns>
private List<string> GetComlist(bool isUseReg)
{
List<string> list = new List<string>();
try
{
if (isUseReg)
{
RegistryKey RootKey = Registry.LocalMachine;
RegistryKey Comkey = RootKey.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM");
String[] ComNames = Comkey.GetValueNames();
foreach (String ComNamekey in ComNames)
{
string TemS = Comkey.GetValue(ComNamekey).ToString();
list.Add(TemS);
}
}
else
{
foreach (string com in SerialPort.GetPortNames()) //⾃动获取串⾏⼝名称
list.Add(com);
}
}
catch
{
MessageBox.Show("串⾏端⼝检查异常!", "提⽰信息");
// System.Environment.Exit(0); //彻底退出应⽤程序
}
return list;
}
2、判断需要的串⼝是否存在本机的串⼝中
///<summary>
///判断是否存在当前串⼝
///</summary>
private void StartSerialPortMonitor()
{
List<string> comList = GetComlist(false); //⾸先获取本机关联的串⾏端⼝列表vs编程软件
if (comList.Count == 0)
{
MessageBox.Show("当前设备不存在串⾏端⼝!", "提⽰信息");
// System.Environment.Exit(0); //彻底退出应⽤程序
}
else
{
string targetCOMPort = "COM8";
//判断串⼝列表中是否存在⽬标串⾏端⼝
if (!comList.Contains(targetCOMPort))
{
MessageBox.Show("提⽰信息", "当前设备不存在配置的串⾏端⼝!");
/
/System.Environment.Exit(0); //彻底退出应⽤程序
}
}
}
3、设置串⼝的参数,如波特率、奇偶校验等。
⾸先定义字段:
private SerialPort serialPort;
///<summary>
///设置通讯串⼝
///</summary>
public void setcom()
{
try
{
StartSerialPortMonitor();
serialPort.PortName = "COM8"; //通信端⼝
serialPort.BaudRate = 9600; //串⾏波特率
serialPort.DataBits = 8; //每个字节的标准数据位长度
serialPort.StopBits = StopBits.Two; //设置每个字节的标准停⽌位数
serialPort.Parity = Parity.None; //设置奇偶校验检查协议
//下⾯这句是当信息中有汉字时,能正确传输,不然会出现问号。
serialPort.Encoding = System.Text.Encoding.GetEncoding("GB2312");
/
/串⼝控件成员变量,字⾯意思为接收字节阀值,
//串⼝对象在收到这样长度的数据之后会触发事件处理函数
//⼀般都设为1
serialPort.ReceivedBytesThreshold = 1;
serialPort.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //设置数据接收事件(监听) serialPort.Open(); //打开串⼝
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
4、打开串⼝,
5、通过串⼝读取数据,处理数据
///<summary>
///通讯有数据进执⾏
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
public void CommDataReceived(Object sender, SerialDataReceivedEventArgs e)
{
getcom();
}
public void getcom()
{
try
{
//定义⼀个字段,来保存串⼝传来的信息。
string str = "";
int len = serialPort.BytesToRead;
Byte[] readBuffer = new Byte[len];
serialPort.Read(readBuffer, 0, len);
str = Encoding.Default.GetString(readBuffer);
//如果需要和界⾯上的控件交互显⽰数据,使⽤下⾯的⽅法。其中ttt是控件的名称。
/
/Dispatcher.Invoke(new Action(() =>
//{
// tttt.Text = str ;
//}));
serialPort.DiscardInBuffer(); //清空接收缓冲区
}
catch (Exception ex)
{
serialPort.Close();
MessageBox.Show(ex.Message);
}
}
6、关闭当前窗⼝时,将串⼝⼀并关闭
private void MainWindow1_Closed(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
serialPort.Close();
}
}
7、可以写⼀个定时器,来循环执⾏1、2两步,保持串⼝通讯正常。如果电脑不存在串⼝,提⽰警告
如果⽬标串⼝不在电脑的串⼝列表⾥,提⽰警告,
如果⽬标串⼝当前是关闭的状态,将其打开。
如果串⼝已经打开,再次打开会报错,⽆法正常⼯作。⼀定要注意。
if (!serialPort.IsOpen)
{
serialPort.Open();
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论