C# SerialPort 串口通讯 通过计算…
来源:互联网 发布:淘宝生活用品店 编辑:程序博客网 时间:2024/06/05 20:21
去年写的一个国家电网的抄表软件用到了SerialPort串口通讯,昨天有个网友说他遇到的问题,无法解决,我吧自己写的代码贴上来,如有问题者可以给我发微博或者MSN haitao_kang@163.com
{ //串口资源 private static SerialPortm_SerialPort = new SerialPort(); //端口号 private static stringm_strPortName = "Com1"; //停止位 private static StopBitsm_StopBits = StopBits.One; //校验位 private static Parity m_Parity= Parity.Even; //每个字节的位数 private static int m_iDataBits= 8; //波特率 private static int m_iBaudRate= 1200; // private static intm_iCurrentRecieveByteCount = 0; //接收数据 private static stringinceptData = ""; //接收数据长度 private static intinceptDataCount = 0; //重复接收次数 private static int count =0; //是否执行递归 private static Boolean flag =false;
public enum DataMode { Text,Hex } public enum LogMsgType {Incoming, Outgoing, Normal, Warning, Error };
///<summary> /// get,set方法 ///</summary> public static intInceptDataCount { get { return SerialPortManage.inceptDataCount;} set { SerialPortManage.inceptDataCount = value;} } public static SerialPortSerialPort { get { return SerialPortManage.m_SerialPort;} set { SerialPortManage.m_SerialPort = value;} } public static intIDataBits { get { return SerialPortManage.m_iDataBits;} set { SerialPortManage.m_iDataBits = value;} } public static stringStrPortName { get { return SerialPortManage.m_strPortName;} set { SerialPortManage.m_strPortName = value;} } public static ParityParity { get { return SerialPortManage.m_Parity; } set { SerialPortManage.m_Parity = value; } } public static intIBaudRate { get { return SerialPortManage.m_iBaudRate;} set { SerialPortManage.m_iBaudRate = value;} } public static StopBitsStopBits { get { return SerialPortManage.m_StopBits; } set { SerialPortManage.m_StopBits = value;} } public static intICurrentRecieveByteCount { get { returnSerialPortManage.m_iCurrentRecieveByteCount; } set { SerialPortManage.m_iCurrentRecieveByteCount= value; } }
public static stringInceptData { get { return SerialPortManage.inceptData; } set { SerialPortManage.inceptData = value;} }
///<summary> /// 设置串口 ///</summary> /// <paramname="strPortName"></param> /// <paramname="iBaudRate"></param> ///<returns></returns> public static BooleansetUpCom(string strPortName, int iBaudRate) { Boolean flag = false; try { if(m_SerialPort.IsOpen) m_SerialPort.Close(); //设置串口参数 m_iBaudRate= iBaudRate; m_strPortName = strPortName; if(openCom()) flag = true; } catch (Exception) {
throw; } return flag; } public static BooleansetUpCom() { Boolean flag = false; try { if(m_SerialPort.IsOpen) m_SerialPort.Close(); //设置串口参数 //m_iBaudRate = m_iBaudRate; //m_strPortName = m_strPortName; if(openCom()) flag = true; } catch (Exception) {
throw; } return flag; }
///<summary> /// 打开串口 ///</summary> ///<returns></returns> public static BooleanopenCom() { Boolean flag = false; try { if(m_SerialPort.IsOpen) m_SerialPort.Close();
//设置串口参数 m_SerialPort.BaudRate = m_iBaudRate; m_SerialPort.DataBits = m_iDataBits; m_SerialPort.StopBits = m_StopBits; m_SerialPort.Parity = m_Parity; m_SerialPort.PortName = m_strPortName; if(m_iBaudRate <= 1200) m_SerialPort.ReadTimeout =1000; else if(m_iBaudRate == 2400) m_SerialPort.ReadTimeout =800; else if(m_iBaudRate == 4800) m_SerialPort.ReadTimeout =500; else if(m_iBaudRate >= 9600) m_SerialPort.ReadTimeout =200; //打开串口 m_SerialPort.Open(); m_SerialPort.DataReceived += newSerialDataReceivedEventHandler(m_SerialPort_DataReceived); flag =true; } catch (Exception) { throw; } return flag; }
///<summary> /// 发送数据 ///</summary> /// <paramname="data"></param> ///<returns></returns> public static intSendData(byte[] data) { //应加判断端口是否已经打开 m_SerialPort.DataReceived += newSerialDataReceivedEventHandler(m_SerialPort_DataReceived);
inceptData = ""; inceptDataCount = 0; count = 0; flag = true; try { //发送数据到串口 m_SerialPort.Write(data, 0, data.Length); } catch (FormatException) { throw; } return data.Length; }
///<summary> /// 接收数据 ///</summary> /// <paramname="sender"></param> /// <paramname="e"></param> public static voidm_SerialPort_DataReceived(object sender,SerialDataReceivedEventArgs e) { //lock ("myLock") //{ intreadCount = 0; //获取字节长度 int bytes =m_SerialPort.BytesToRead;
//创建字节数组 byte[]buffer = new byte[bytes]; //ComPort.ReadTimeout = 100; //读取缓冲区的数据到数组 readCount =m_SerialPort.Read(buffer, 0, bytes); Log(LogMsgType.Incoming,ByteArrayToHexString(buffer), readCount); if(InceptData.EndsWith("16") || count > 5) { flag = false; return; } else { if (flag) { System.Threading.Thread.Sleep(200); m_SerialPort_DataReceived(); } else return; } //} }
///<summary> /// 接收数据 ///</summary> public static voidm_SerialPort_DataReceived() { //m_SerialPort.DataReceived += newSerialDataReceivedEventHandler(m_SerialPort_DataReceived); //lock ("myLock") //{ count++; System.Threading.Thread.Sleep(100); intreadCount = 0; //获取字节长度 int bytes =m_SerialPort.BytesToRead;
//创建字节数组 byte[]buffer = new byte[bytes]; //ComPort.ReadTimeout = 100; //读取缓冲区的数据到数组 readCount =m_SerialPort.Read(buffer, 0, bytes); //显示读取的数据到数据窗口 if(!(buffer.Length < 2)) { Log(LogMsgType.Incoming,ByteArrayToHexString(buffer), readCount); } if(InceptData.EndsWith("16") || count > 5) { flag = false; return; } else { if (flag) { System.Threading.Thread.Sleep(200); m_SerialPort_DataReceived(); } else return; } //} }
///<summary> /// 显示数据日志 ///</summary> /// <paramname="msgtype"></param> /// <paramname="msg"></param> /// <paramname="count"></param> private static voidLog(LogMsgType msgtype, string msg, int count) { //this.richTextBox1.Invoke(newEventHandler(delegate //{ inceptData += msg; inceptDataCount += count; //this.richTextBox1.SelectedText =string.Empty; //this.richTextBox1.SelectionFont = newFont(this.richTextBox1.SelectionFont, FontStyle.Bold); //this.richTextBox1.SelectionColor =LogMsgTypeColor[(int)msgtype]; //this.richTextBox1.AppendText(msg); //this.richTextBox1.ScrollToCaret(); //}));
//MessageBox.Show(data); } ///<summary> /// 十六进制转换字节数组 ///</summary> /// <paramname="s"></param> ///<returns></returns> private static byte[]HexStringToByteArray(string s) { s = s.Replace(" ", ""); byte[] buffer = new byte[s.Length / 2]; for (int i = 0; i < s.Length; i +=2) buffer[i /2] = (byte)Convert.ToByte(s.Substring(i, 2), 16); return buffer; } ///<summary> /// 字节数组转换十六进制 ///</summary> /// <paramname="data"></param> ///<returns></returns> private static stringByteArrayToHexString(byte[] data) { StringBuilder sb = new StringBuilder(data.Length* 3); foreach (byte b in data) sb.Append(Convert.ToString(b, 16).PadLeft(2,'0'));//.PadRight(3, ' ')); return sb.ToString().ToUpper(); } }
我写的是用的多线程来操作串口的
代码如下:
public class SerialPortManage
0 0
- C# SerialPort 串口通讯 通过计算…
- objective c 计算
- C# 串口通信
- C# 串口操作系列(2) --&…
- Pro*C OCI …
- IOS Objective c 同步 异步链接 …
- Improved logging in Objective-C …
- Bootloader and Uboot compiled, c…
- C# StreamReader 和 StreamWriter …
- It is never too late to make a c…
- C++ typeid: find out type in rea…
- poj 3083 Children of the Candy C…
- A temporary table could not be c…
- 集线器 交换机 路由器 网桥 …
- matlab eig() 计算矩阵…
- USG6000v 通过静态IPv4 …
- shell 计算字符长度 echo $(expr …
- C++ static_cast
- 说说程序员 "必备能力"
- 工作经验是什么经验?
- 用户自定义属性ID和自定义属性值不…
- 【ffmpeg重温】
- 《图解易经:一本终于可以读懂的易…
- C# SerialPort 串口通讯 通过计算…
- 女人分5等 你算第几等?
- Web自动化测试(4): Selenium Web Driver 操作控件完成页面自动化测试的例子。
- 中国历史一目了然
- 解读《道德经》 五十六章 知者不言…
- 二人转:两片面包一块肉
- 拿什么拯救“恐归族”们的幸福…
- 实拍:场面震撼的加拿大殉职…
- 很多人在睡觉的时候半梦半醒时,感…