




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、我们来看具体的实现步骤。公司要求实现以下几个功能:1):实现两台计算机之前的串口通信, 以 16 进制形式和字符串两种形 式传送和接收。2):根据需要设置串口通信的必要参数。3):定时发送数据。4):保存串口设置。看着好像挺复杂,其实都是纸老虎,一戳就破,前提是你敢去戳。 我尽量讲的详细一些,争取说到每个知识点。在编写程序前,需要将你要测试的 COM 口短接,就是收发信息 都在本地计算机,短接的方式是将 COM 口的 2 、3 号针接起来。 COM 口各针的具体作用,度娘是这么说的: COM 口 。记住 2 、3 针连接一 定要连接牢固,我就是因为接触不良,导致本身就不通,白白花掉了一 大半天
2、时间调试代码。面给出主要的操作界面,如下:我分块给出代码顺便,我将所有控件对应的代码名字也附上了,相信对初学者来说,再 看下面的代码会轻松很多。控件名字命名的方法是“控件名 + 作用”的 形式,例如“打开串口”的开关按钮,其名字是 btnSwitch (btn 就 是 button 的简写了)。我认为这种命名控件的方式比较好,建议大家 使用,如果你有好的命名方式,希望你能告诉我! 下面我们将各个功能按照从主到次的顺序逐个实现。实现,详细代码见链接: C# 串口通信工具 )、获取计算机的 COM 口总个数,将它们列为控件 cbSerial 的候选项,并将第一个设为 cbSerial 的默认选项。
3、这部分是在窗体加载时完成的。请看代码:(很多信息代码的注释里讲的很清楚,我就不赘述了。)csharpview plaincopyprint?1. / 检查是否含有串口2.string str = SerialPort.GetPortNames();3.if (str = null)4.5.MessageBox.Show( 本机没有串口! , Error);6.return;7.8.9./ 添加串口项目10.foreach (string s in System.IO.Ports.SerialPort.GetPortNames()11./ 获取有多少个 COM 口12.cbSerial.Item
4、s.Add(s);13.14.15./ 串口设置默认选择项16.cbSerial.SelectedIndex = 0;/的默认选项cbSerial 二、“串口设置”这面我没代码编程, 直接从窗体上按照串口信息设置就行。 我们仅设置 它们的默认选项,但这里我用到了 ini 文件,暂时不讲,我们先以下面 形式设置默认。csharp view plaincopyprint?1. cbBaudRate.SelectedIndex = 5;2. cbDataBits.SelectedIndex = 3;3. cbStop.SelectedIndex = 0;4. cbParity.SelectedInd
5、ex = 0;5. radio1.Checked = true; / 发送数据的“ 16 进制”单选按钮(这里我忘了改名, 现在看着很不舒服!)6. rbRcvStr.Checked = true;三、打开串口在发送信息之前, 我们需要根据选中的选项设置串口信息, 并设置一些 控件的属性,最后将串口打开。csharp view plaincopyprint?private void btnSwitch_Click(object sender, EventArgs e) /sp1 是 量。 SerialPort sp1 = new SerialPort();if (!sp1.IsOpen)try
6、/ 设置串口号string serialName = cbSerial.SelectedItem.Tsp1.PortName = serialName;全局变oString();/ 设置各“串口设置”string strBaudRate = cbBaudRate.T ext;string strDateBits = cbDataBits.T ext;string strStopBits = cbStop.Text;Int32 iBaudRate = Convert.ToInt32(strBaudRate);Int32 iDateBits = Convert.ToInt32(strDateBit
7、s);sp1.BaudRate = iBaudRate;/ 波特率..1.sp1.DataBits = iDateBits; / 数据位switch (cbStop.Text)/停止位22.23.case 1:24.sp1.StopBits =StopBits.One;25.break;26.case 1.5:27.sp1.StopBits =StopBits.OnePointFive;28.break;29.case 2:30.sp1.StopBits =StopBits.Two;31.bre
8、ak;32.default:33.MessageBox.Show(Error:参数不正确34.break;35.36.switch (cbParity.Text) /校验位37.38.case 无 :39.sp1.Parity = Parity.None;40.break;41.case 奇校验42.sp1.Parity = Parity.Odd;43.break;, Error);5.case 偶校验 :sp1.Parity = Parity.Even;break;
9、default:MessageBox.Show(Error :参数不正确 !, Error); break;if (sp1.IsOpen = true)/ 如果打开状态,则先关闭一下sp1.Close();/ 状态栏设置tsSpNum.T ext = 串口号: + sp1.PortName + |;tsBaudRate.Text = 波特率: + sp1.BaudRate + |;tsDataBits.Text = 数据位: + sp1.DataBits + |;tsStopBits.Text = 停止位: + sp1.StopBits + |;tsParity.T ext = 校验位: +
10、sp1.Parity + |;/ 设置必要控件不可用cbSerial.Enabled = false;cbBaudRate.Enabled = false;7.cbDataBits.Enabled = false;cbStop.Enabled = false;cbParity.Enabled = false;sp1.Open(); / 打开串口btnSwitch.T ext = 关闭串口 ;catch (System.Exception ex)MessageBox.S
11、how(Error: + ex.Message, Error);return;else/ 状态栏设置tsSpNum.T ext = 串口号:未指定 |; tsBaudRate.T ext = 波特率:未指定 |; tsDataBits.T ext = 数据位:未指定 |; tsStopBits.T ext = 停止位:未指定 |; tsParity.Text = 校验位:未指定 |;/ 恢复控件功能88./ 设置必要控件不可用89.cbSerial.Enabled = true;90.cbBaudRate.Enabled = true;91.cbDataBits.Enabled = true;
12、92.cbStop.Enabled = true;93.cbParity.Enabled = true;94.95.sp1.Close(); / 关闭串口96.btnSwitch.Text = 打开串口97.98.发送信息因为这里涉及到字符的转换,难点在于, 在发送 16 进制数据时,如何将文本框中的字符数据在内存中以同样的形式表现出来, 例如我们输入16 进制的“ eb 90 ”显示到内存中 ,也就是如下形式:或输入我们想要的任何字节,如上面的“ 12 34 56 78 90内存中的数据时 16 进制显示的,而我们输入的数据时字符串,我们需 要将字符串转换为对应的 16 进制数据,然后将这个
13、 16 进制数据转换 为字节数据 ,用到的主要方法是:Convert.ToInt32 (String, Int32) ;Convert.ToByte (Int32);这是我想到的,如果你有好的方法,希望你能告诉我下面看代码:csharp view plaincopyprint?1. private void btnSend_Click(object sender, EventArgs e)..9.if (!sp1.IsOpen) /如果没打开MessageBox.Show( 请先打开串口! , Error);
14、return;String strSend = txtSend.Text;if (radio1.Checked = true) /“ 16 进制发送” 按钮/ 处理数字转换,目的是将输入的字符按空格、 “,”等分组,以便发送 数据时的方便(此处转的比较麻烦,有高见者,请指点!)string sendBuf = strSend;string sendnoNull = sendBuf.Trim();string sendNOComma = sendnoNull.Replace(, ); / 去 掉 英 文 逗号string sendNOComma1 = sendNOComma.Replace( ,
15、 , ); / 去掉 中文逗号string strSendNoComma2 = sendNOComma1.Replace(0x, );/ 去掉 0xstrSendNoComma2.Replace(0X, ); / 去掉 0X string strArray = strSendNoComma2.Split( );2.33. /strArray数组中会出现“”空字符的情况,影响下面的赋值操作,故 byteBufferLength 应减小 int byteBufferLength = strArray.Length;for (
16、int i = 0; i strArray.Length; i+ )if (strArrayi=)byteBufferLength-;byte byteBuffer = new bytebyteBufferLength;int ii = 0; / 用 于 byteBuffer赋for (int i = 0; i strArray.Length; i+)/ 对获取的字符做相加运算34.35.36.Byte bytesOfStr = Encoding.Default.GetBytes(strArrayi);37.38.int decNum = 0;39.if (strArrayi = )40.41
17、.continue;42.43.else44.45.decNum = Convert.ToInt32(strArrayi, 16); /atrArrayi =12 时,temp = 1846.47.48.try / 防止输错,使其只能输入一个字节的字符,即只能在里输入“eb 90 ”等字符串,不能输入“ 123 2345 ”等超出字节范围的数字49.50.byteBufferii = Convert.ToByte(decNum);51.52.catch (System.Exception ex)53.txtSend55.return;56.54.MessageBox.Show( 字节越界,请逐
18、个字节输入! , Error);57.58.ii+;59.60.sp1.Write(byteBuffer, 0, byteBuffer.Length);61.62.else / 以字符串形式发送时63.64.sp1.WriteLine(txtSend.T ext); / 写入数据65.66.五、数据的接收亮点来了,看到这里,如果你还没吐(可能是我的代码比较拙劣!), 那么下面的知识点对你也不成问题。这里需要用到 委托 的知识,我是搞 C/C+ 出身,刚碰到这个知识点 还真有点不适应。为了不偏离主题,关于委托,我仅给出两条比较好的 链接,需要的网友可以去加深学习: C#委托 、订阅委托事件 。在
19、窗体加载时就订阅上委托是比较好的, 所以在 Form1_Load 中添加以下代码:csharp view plaincopyprint?1. Control.CheckForIllegalCrossThreadCalls = false; / 意图见解释2. sp1.DataReceived += new SerialDataReceivedEventHandler(sp1_DataReceived); / 订阅委托注意,因为 自.net 2.0 以后加强了安全机制 ,,不允许在 winform 中直接跨线程 (事件触发需要产生一个线程处理)访问控件的属性,第 一条代码的意图是说在这个类中我们
20、强制不检查跨线程的调用是否合 法。处理这种问题的解决方案有很多, 具体可参阅以下内容: 解决方案好了,订阅委托之后,我们就可以处理接收数据的事件了。csharp view plaincopyprint?1. void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)2. 3. if (sp1.IsOpen) / 此处可能没有必要判断是否打开串口,但为了严谨性,我还是加上了4.5.byte byteRead = new bytesp1.BytesToRead; /BytesToRead:sp1 接收的字符个数6.if (
21、rdSendStr.Checked)/ 发送字符串 单选按钮7.8.txtReceive.T ext += sp1.ReadLine() + rn; /注意:回车换行必须这样写,单独使用 r 和 n 都不会有效果9. sp1.DiscardInBuffer(); / 清 空 SerialPort 控 件 的 Buffer10.11.else/ 发送 16 进制按钮 12.13.try14.15. Byte receivedData = new Bytesp1.BytesToRead;/创 建接收字节数组16. sp1.Read(receivedData, 0, receivedData.Len
22、gth);/读 取数据17.sp1.DiscardInBuffer();/ 清空 SerialPort 控4.25.件的 Bufferstring strRcv = null;for (int i = 0; i receivedData.Length; i+) /窗体显示strRcv += receivedDatai.T oString(X2); /16 进制显示txtReceive.T ext += strRcv + rn;26.27.catch (System.Exception ex)28.29.MessageBox.Show(ex.Message,
23、 出错提示 );30.txtSend.T ext = ;4.else35.36.MessageBox.Show( 请打开某个串口 , 错误提示 );37.38.为了友好和美观,我将当前时间也显示出来,又将显示字体的颜 色做了修改:csharp view plaincopyprint?1. / 输出当前时间3.2. DateTime dt = DateTime.Now;txtReceive.T ext += dt.GetDateTimeFormats(f)0.Tn;4.txtReceive.SelectAll();5.txtReceive.SelectionColor = C
24、olor.Blue; /改变字体的颜色做到这里,大部分功能就已实现了,剩下的工作就是些简单的操作设置 了,有保存设置、定时发送信息、控制文本框输入内容等。六、保存设置 这部分相对简单,但当时我没接触过,也花了点时间,现在想想,也不 过如此。保存用户设置用 ini 文件是个不错的选择, 虽然大部分都用注册表实现, 但 ini 文件保存还是有比较广泛的使用。.ini 文件是 Initialization File 的缩写,也就是初始化文件。 为了不偏离正题,也不过多说明,可参考相关内容(网上资源都不错, 因人而异,就不加链接了)。使用 Inifile 读写 ini 文件,这里我用到了两个主要方法:
25、csharp view plaincopyprint?1. / 读出 ini 文件2. a:=inifile.Readstring( 节点 , 关键字 , 缺省值 );/ string 类型3. b:=inifile.Readinteger(节点 , 关键字 , 缺省值 );/ integer 类型4. c:=inifile.Readbool( 节点 , 关键字 ,缺省值 );/ boolean 类型5. 其中缺省值 为该 INI 文件不存在该关键字时返回的缺省值。6. / 写入 INI 文件 :7. inifile.writestring( 节点,关键字 ,变量或字符串值 );8. inif
26、ile.writeinteger( 节点 , 关键字 , 变量或整型值 );9. inifile.writebool( 节点 , 关键字 , 变量或 True 或 False);请看代码:csharp view plaincopyprint?1. /using 省写了2. namespace INIFILE3. 4. class Profile5. 6.public static void LoadProfile()7.8. string strPath = AppDomain.CurrentDomain.BaseDirectory;9._file = new IniFile(strPath
27、+ Cfg.ini);10. G_BAUDRATE = _file.ReadString(CONFIG, BaudRate, 4800); / 读数据,下同11. G_DATABITS = _file.ReadString(CONFIG, DataBits, 8);12. G_STOP = _file.ReadString(CONFIG, StopBits, 1);13. G_PARITY = _file.ReadString(CONFIG, Parity, NONE);14.15. 16.17. public static void SaveProfile()18. 19. string s
28、trPath = AppDomain.CurrentDomain.BaseDirectory;20. _file = new IniFile(strPath + Cfg.ini);21. _file.WriteString(CONFIG, BaudRate, G_BAUDRATE); / 写数据,下同22. _file.WriteString(CONFIG, DataBits, G_DATABITS);23. _file.WriteString(CONFIG, StopBits, G_STOP);24. _file.WriteString(CONFIG, G_PARITY, G_PARITY)
29、;25. 26.27. private static IniFile _file;/ 内置了一个对象28.29. public static string G_BAUDRATE = 1200;/ 给 ini 文件赋新值,并且影响 界面下拉框的显示30. public static string G_DATABITS = 8;31. public static string G_STOP = 1;32. public static string G_PARITY = NONE;33. 34._file 声明成了内置对象,可以方便各函数的调用 下面是“保存设置”的部分代码:csharp view
30、plaincopyprint?1. private void btnSave_Click(object sender, EventArgs e)2.3.4./ 设置各“串口设置”5.string strBaudRate = cbBaudRate.Text;6.string strDateBits = cbDataBits.Text;7.string strStopBits = cbStop.Text;8.Int32 iBaudRate = Convert.ToInt32(strBaudRate);9.Int32 iDateBits = Convert.ToInt32(strDateBits);
31、10.11.12.Profile.G_BAUDRATE = iBaudRate+;/波特率13.Profile.G_DATABITS = iDateBits+; /数据位14.switch (cbStop.Text) / 停止位15.16.case 1:17.Profile.G_STOP= 1;18.break;19.case 1.5:20.Profile.G_STOP= 1.5;21.break;22./ 防止过多刷屏,下面省写了23.24.25.switch (cbParity.Text) /26.27.case 无 :28.Profile.G_PARITY = NONE;29.break;30.31.32.Profile.SaveProfile(); /保存设置33.校验位读取 ini 文件主要在加载窗体时执行:INIFILE.Profile.LoadProfile();/ 加载所有 七、控制文本输入这里倒挺简单,只是注意一点。当我们控制输入非法字符时, 可通过控制 e.Handed 的属性值实现,注意这里的 Handed 属性是“操作过” 的含义,而非“执行此处操作”之意 ,H
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 品牌与价格关联性-洞察及研究
- 部队交通安全培训内容课件
- 河南省南阳市镇平县2024-2025学年八年级下学期3月月考生物学试题(含答案)
- 20xx建设承诺书4篇
- 【2025年秋七上语文阶段测试】第3单元学业质量评价01(解析版)
- 山东省2025年普通高校招生网上报名信息表
- 车险销售原理课件
- 基于区块链的分离式墨盒供应链溯源系统构建瓶颈
- 城市更新浪潮中商务综合体功能迭代与社区服务融合的设施适配性
- 国际奢侈品赛道中东方纹样溢价权争夺的定价权困局
- 水利水电工程单元工程施工质量验收标准第8部分:安全监测工程
- 2025年黑龙江全国导游人员资格考试(全国导游基础知识、地方导游基础知识)历年参考题库含答案详解(5套)
- 分级护理落实率
- 如何做好班级管理的讲座
- 中小企业风险管理(新)
- 幼儿园改造提升项目可行性研究报告
- 2025年贵州省行政执法人员考试题库及答案
- GB/T 26548.5-2025手持便携式动力工具振动试验方法第5部分:钻和冲击钻
- 萝岚呗哥某集团组织管控模式细化项目报告
- 慢粒性白血病护理常规
- 湖北省砂石经营管理办法
评论
0/150
提交评论