77范文网 - 专业文章范例文档资料分享平台

c#串口通信(2)

来源:网络收集 时间:2019-03-16 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

78. }

79. else 80. {

81. //状态栏设置

82. tsSpNum.Text = \串口号:未指定|\83. tsBaudRate.Text = \波特率:未指定|\84. tsDataBits.Text = \数据位:未指定|\85. tsStopBits.Text = \停止位:未指定|\86. tsParity.Text = \校验位:未指定|\87. //恢复控件功能

88. //设置必要控件不可用 89. cbSerial.Enabled = true; 90. cbBaudRate.Enabled = true; 91. cbDataBits.Enabled = true; 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进制数据,然后将这个16进制数据转换为字节数据,用到的主要方法是: Convert.ToInt32 (String, Int32); Convert.ToByte (Int32);

这是我想到的,如果你有好的方法,希望你能告诉我。 下面看代码:

[csharp] view plaincopyprint?

1. private void btnSend_Click(object sender, EventArgs e) 2. {

3. if (!sp1.IsOpen) //如果没打开 4. {

5. MessageBox.Show(\请先打开串口!\6. return; 7. }

8.

9. String strSend = txtSend.Text;

10. if (radio1.Checked == true) //“16进制发送” 按钮

11. {

12. //处理数字转换,目的是将输入的字符按空格、“,”等分组,以便发送数据时的方便(此处转的比较麻烦,有高见者,请指点!) 13. string sendBuf = strSend;

14. string sendnoNull = sendBuf.Trim();

15. string sendNOComma = sendnoNull.Replace(',', ' '); //去掉英文逗号

16. string sendNOComma1 = sendNOComma.Replace(',', ' '); //去掉中文逗号 17. string strSendNoComma2 = sendNOComma1.Replace(\\去掉0x

18. strSendNoComma2.Replace(\去掉0X 19. string[] strArray = strSendNoComma2.Split(' '); 20.

21.

22. int byteBufferLength = strArray.Length;

23. for (int i = 0; i <

25. if (strArray[i]==\

26. {

27. byteBufferLength--; 28. }

29. } 30.

31. byte[] byteBuffer = new byte[byteBufferLength];

32. int ii = 0;

33. for (int i = 0; i < strArray.Length; i++) //对获取的字符做相加运算

34. { 35.

36. Byte[] bytesOfStr = Encoding.Default.GetBytes(strArray[i]);

37.

38. int decNum = 0; 39. if (strArray[i] == \40. {

41. continue;

42. } 43. else 44. {

45. decNum = Convert.ToInt32(strArray[i], 16); //atrArray[i] == 12时,temp == 18 46. } 47.

48. try //防止输错,使其只能输入一个字节的字符,即只能在txtSend里输入 “eb 90”等字符串,不能输入“123 2345”等超出字节范围的数字

49. {

50. byteBuffer[ii] = Convert.ToByte(decNum); 51. }

52. catch (System.Exception ex) 53. {

54. MessageBox.Show(\字节越界,请逐个字节输入!\

55. return; 56. } 57.

58. ii++; 59. }

60. sp1.Write(byteBuffer, 0, byteBuffer.Length); 61. }

62. else //以字符串形式发送时

63. {

64. sp1.WriteLine(txtSend.Text); //写入数据 65. } 66. }

五、数据的接收

亮点来了,看到这里,如果你还没吐(可能是我的代码比较拙劣!),那么下面的知识点对你也不成问题。

这里需要用到 委托 的知识,我是搞C/C++出身,刚碰到这个知识点还真有点不适应。为了不偏离主题,关于委托,我仅给出两条比较好的链接,需要的网友可以去加深学习:C#委托、订阅委托事件。

在窗体加载时就订阅上委托是比较好的,所以在Form1_Load中添加以下代码:

[csharp] view plaincopyprint?

1. Control.CheckForIllegalCrossThreadCalls = false; //意图见解释 2. sp1.DataReceived += new SerialDataReceivedEventHandler(sp1_DataReceived); //订阅委托

注意,因为自.net 2.0以后加强了安全机制,,不允许在winform中直接跨线程(事件触发需要产生一个线程处理)访问控件的属性,第一条代码的意图是说在这个类中我们强制不检查跨线程的调用是否合法。处理这种问题的解决方案有很多,具体可参阅以下内容:解决方案。 好了,订阅委托之后,我们就可以处理接收数据的事件了。

[csharp] view plaincopyprint?

1. void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e) 2. {

3. if (sp1.IsOpen) //此处可能没有必要判断是否打开串口,但为了严谨性,我还是加上了 4. {

5. byte[] byteRead = new byte[sp1.BytesToRead]; //BytesToRead:sp1接收的字符个数

6. if (rdSendStr.Checked) //'发送字符串'单选按钮 7. {

8. txtReceive.Text += sp1.ReadLine() + \注意:回车换行必须这样写,单独使用\和\都不会有效果

9. sp1.DiscardInBuffer(); //清空SerialPort控件的Buffer 10. }

11. else //'发送16进制按钮' 12. { 13. try 14. {

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库c#串口通信(2)在线全文阅读。

c#串口通信(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/528238.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: