通过COM1发送数据,COM2接收数据。当COM2接收完本次发送的数据后,向COM1发送信息通知COM1本次数据已发完,COM1接到通知后,再发下一段数据。这样可以确保每次发送的数据都可以被正确接收。
代码:
using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms; System.IO.Ports; System.Threading; Utils; namespace 串口通信 { public partial class Form1 : Form { #region 变量 /// <summary> /// 启动还是停止,true起动,false停止 </summary> static bool start = true; 串口资源 private static SerialPort serialPort1 = nullstatic SerialPort serialPort2 = 成功次数 int successCount = 0 失败次数 int errorCount = 上次计算的总次数 int lastCount = 定时器 private System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); #endregion #region Form1 public Form1() { InitializeComponent(); } #region Form1_Load void Form1_Load(object sender,EventArgs e) { serialPort1 = new SerialPort("COM1"); serialPort1.DataReceived += SerialDataReceivedEventHandler(serialPort_DataReceived1); serialPort1.open(); serialPort2 = COM2); serialPort2.DataReceived += SerialDataReceivedEventHandler(serialPort_DataReceived2); serialPort2.open(); } #region Form1_FormClosed void Form1_FormClosed(dispose(); serialPort2.Close(); serialPort2.dispose(); } #region btnStart_Click void btnStart_Click(; SendData(); timer.Interval = 500; timer.Tick += new EventHandler(delegate( obj,EventArgs eventArgs) { if (lastCount == ) { lastCount = successCount + errorCount; } else { int cnt = successCount + errorCount - lastCount; cnt = Data.Length * cnt / 1024 * (1000 / timer.Interval); double total = (successCount + errorCount) * Data.Length / 1024.0; InvokeDelegate invokeDelegate = delegate() { label3.Text = cnt.ToString() + KB/S " + total.ToString(#.0") + KB; }; InvokeUtil.Invoke(this,invokeDelegate); lastCount = successCount + errorCount; } }); timer.Start(); } #region btnStop_Click void btnStop_Click(false; timer.Stop(); timer.dispose(); timer = System.Windows.Forms.Timer(); } #region 接收串口数据事件 接收串口数据事件 </summary> <param name="sender"></param> <param name="e"></param> void serialPort_DataReceived1(if (serialPort1.ReadLine() != ) { successCount++; SendData(); } } void serialPort_DataReceived2(byte> bList = new List<byte>(); int i = ; while (serialPort2.BytesToRead > ) { byte[] bArr = new byte[serialPort2.BytesToRead]; i += serialPort2.Read(bArr,success); string s = ASCIIEncoding.UTF8.GetString(bList.ToArray()); InvokeDelegate invokeDelegate = () { textBox2.Text = s; }; InvokeUtil.Invoke(if (s != Str) { errorCount++; invokeDelegate = () { label2.Text = errorCount + 次不相等(失败); }; InvokeUtil.Invoke( { invokeDelegate = () { label1.Text = successCount + 次相等(成功)#region 发送数据 void SendData() { if (start) { Thread thread = new Thread(new ParameterizedThreadStart( obj) { InvokeDelegate invokeDelegate = () { textBox1.Text = Str; }; InvokeUtil.Invoke(#region 数据 byte[] data = 数据 [] Data { get { if (data == ) { data = ASCIIEncoding.UTF8.GetBytes(Str); } return data; } } #region 获取字符串 string str = 字符串 string Str { if (str == ) { StringBuilder sb = StringBuilder(); for (0; i < 270; i++) { sb.Append(计算机程序); } str = sb.ToString(); } str; } } #endregion } }
辅助代码:
System.Windows.Forms; Utils { <summary> 跨线程访问控件的委托 </summary> delegate InvokeDelegate(); 跨线程访问控件类 InvokeUtil { 跨线程访问控件 <param name="ctrl">Form对象</param> <param name="de">委托</param> Invoke(Control ctrl,Delegate de) { (ctrl.IsHandleCreated) { ctrl.BeginInvoke(de); } } } }
Microsoft.Win32; System.Security.Permissions; System.Security; 串口资源工具类 SerialPortUtil { #region 获取本机串口列表,包括虚拟串口 获取本机串口列表,包括虚拟串口 [] GetCOMList() { List<string> list = string>(); foreach (string portName in SerialPort.GetPortNames()) { list.Add(portName); } list.ToArray(); } #region 从注册表获取本机串口列表 从注册表获取本机串口列表 [] GetPortNames() { RegistryKey localMachine = ; RegistryKey key2 = string[] textArray = ; //这里有个断言,判断该注册表项是否存在 new RegistryPermission(RegistryPermissionAccess.Read,1)">@"HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM).Assert(); try { localMachine = Registry.LocalMachine; key2 = localMachine.OpenSubKey(HARDWARE\DEVICEMAP\SERIALCOMM",); if (key2 != ) { string[] valueNames = key2.GetValueNames(); textArray = [valueNames.Length]; 0; i < valueNames.Length; i++) { textArray[i] = ()key2.GetValue(valueNames[i]); } } } finallyif (localMachine != ) { localMachine.Close(); } ) { key2.Close(); } CodeAccesspermission.RevertAssert(); } if (textArray == ) { textArray = string[]; } textArray; } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。