原文:C# ---- 串口数据YSI实例

C#----串口数据接收发送中,发送接收数据已经可以模拟了。

本次YSI实例过程中 主要是:类型转换问题 、计算校验码

一、不同设备不同的规则,本次实例代码如下:

  1. string serialNumber = sn;//Packet Command Payload
  2.  
  3. int i1 = 0x11;//Packet Length Byte
  4. int i2 = 0xA5;//Packet Sync Byt[]
  5.  
  6. string[] strarr = new string[];//命令字符串
  7. strarr[] = Convert.ToString(i1, );//转化固定字符
  8. strarr[] = Convert.ToString(i2, );//转化固定字符
  9.  
  10. char[] arr = serialNumber.ToCharArray();//字符数组
  11.  
  12. int[] ii = new int[];//整形数组,为了计算校验码
  13. ii[] = i1;//转化固定字符
  14. ii[] = i2;//转化固定字符
  15.  
  16. for (int i = ; i < arr.Length; i++)
  17. {
  18. strarr[ + i] = Convert.ToString(arr[i], );
  19. ii[ + i] = (int)arr[i];
  20. }
  21. //计算校验码
  22. int checksum = ;
  23. for (int i = ; i < ii.Length; i++)
  24. {
  25. checksum += ii[i];
  26. if (checksum > )
  27. checksum = checksum - ;
  28. }
  29. strarr[] = Convert.ToString(checksum, );

上述,一是采用强制类型转换 char 类型为 16进制int,然后计算校验码;二是将char转换为16进制形式的string。

这样最后就得出需要发送的字符串数组。

二、发送字符串数据并且接收数据,代码如下:

  1. //计算传输字符串
  2. string[] sendstr = Sendstr(sdstr);
  3. //发送字节数组
  4. byte[] wbb = new byte[];
  5. //转换成16进制字节
  6. for (int i = ; i < sendstr.Length; i++)
  7. {
  8. wbb[i] = Convert.ToByte(sendstr[i], );
  9. }
  10. //接收字节数组
  11. byte[] rdb = new byte[];
  12.  
  13. //打开新的串行端口连接
  14. sp.Open();
  15. //丢弃来自串行驱动程序的接受缓冲区的数据
  16. sp.DiscardInBuffer();
  17. //丢弃来自串行驱动程序的传输缓冲区的数据
  18. sp.DiscardOutBuffer();
  19. //使用缓冲区的数据将指定数量的字节写入串行端口
  20. sp.Write(wbb, , wbb.Length);
  21. //当前线程挂起500毫秒
  22. System.Threading.Thread.Sleep();
  23. //读取数据超时
  24. sp.ReadTimeout = ;
  25. //读取接收数据
  26. sp.Read(rdb, , rdb.Length);

上述,一是需要转换为字节发送,设备要求16进制字节;二是发送数据后,可以挂起线程500毫秒,避免数据冲突的问题。

这样返回字节数组rdb。

三、接收后的字节数组,需要转换解析,代码如下:

  1. //读取记录转换为字符串
  2. string[] rdstr = new string[];
  3. for (int i = ; i < rdb.Length; i++)
  4. {
  5. rdstr[i] = rdb[i].ToString("X2");
  6. }

上述,先转换为16进制字符串。

四、最终需要收集的数据是浮点型数据

网上搜到一个string 与浮点类型相互转换的类,可以直接使用,代码如下:

  1. class stConvertFloat
  2. {
  3. public static string FloatToStandard(double f, int style)
  4. {
  5. char[] Num = new char[];//32为二进制结果加1结束符
  6.  
  7. if (f < ) //f为负数 ,符号位Num[0]赋1
  8. {
  9. Num[] = '';
  10. f = f * (-); //转换为整数
  11. }
  12. else
  13. Num[] = '';
  14.  
  15. //求指数
  16. int exponent = ;
  17. if (f >= )//指数符号为正情况,即fabs(f)>=1
  18. {
  19. while (f >= )
  20. {
  21. exponent++;
  22. f = f / ;
  23. }
  24. }
  25. else//负指数情况
  26. {
  27. while (f < )
  28. {
  29. exponent++;
  30. f = f * ;
  31. }
  32. exponent = ( - exponent) + ;//(128-exponent)为补码,+128是指数符号位置1
  33. }
  34.  
  35. exponent += ;//指数转换为阶码
  36.  
  37. int i;
  38. for (i = ; i >= ; i--)//将指数转换为二进制数
  39. {
  40. if (exponent % == )
  41. Num[i] = '';
  42. else
  43. Num[i] = '';
  44. exponent /= ;
  45. }
  46.  
  47. f = f - ;//小数转换为标准格式
  48. //求小数部分
  49. double s = ;
  50. for (i = ; i < ; i++)
  51. {
  52. s /= ;
  53. if (f >= s)
  54. {
  55. //MessageBox.Show(Convert.ToString(s));
  56. f = f - s;
  57. Num[i] = '';
  58. }
  59. else
  60. Num[i] = '';
  61. }
  62.  
  63. if (style == )//二进制输出
  64. {
  65. string tt = new string(Num);
  66. return tt;
  67. }
  68. else //二进制转换为十六进制
  69. {
  70. char sum;
  71. int j = ;
  72. for (i = ; i < ; i = i + , j++)
  73. {
  74. sum = Convert.ToChar((Num[i] - '') * + (Num[i + ] - '') * + (Num[i + ] - '') * + (Num[i + ] - ''));
  75. if (sum > )
  76. Num[j] = Convert.ToChar((sum - ) + 'a');
  77. else
  78. Num[j] = Convert.ToChar(sum + '');
  79. }
  80. string tt = new string(Num);
  81. tt = tt.Substring(, );
  82. return tt;
  83. }
  84. }
  85.  
  86. public static double StandardToFloat(string FNum, int style)
  87. {
  88. char[] Num = new char[];
  89. char[] Hex = new char[];
  90.  
  91. int i, j, value;
  92.  
  93. if (style == )//二进制
  94. {
  95. for (i = ; i < ; i++)
  96. Num[i] = FNum[i];
  97. }
  98. else//十六进制转换为二进制
  99. {
  100. for (i = ; i < ; i++)
  101. {
  102. Hex[i] = FNum[i];
  103. if (Hex[i] >= '' && Hex[i] <= '')
  104. value = Hex[i] - '';
  105. else
  106. {
  107. Hex[i] = Convert.ToChar(Hex[i] | 0x20); //统一转换为小写
  108. value = Hex[i] - 'a' + ;
  109. }
  110. for (j = ; j >= ; j--)
  111. {
  112. Num[i * + j] = Convert.ToChar((value % ) + '');
  113. value /= ;
  114. }
  115. }
  116. }
  117.  
  118. double f = ;//f为最终浮点数结果,标准浮点格式隐含小数点前的1
  119. double s = ;//s为小数各个位代表的权值
  120.  
  121. for (i = ; i < ; i++)//转换小数部分
  122. {
  123. s /= ;
  124. if (Num[i] == '')
  125. {
  126. f += s;
  127. //MessageBox.Show(Convert.ToString(s));
  128. }
  129. }
  130.  
  131. int exponent = ;//指数部分
  132. int d = ;//d代表指数部分各位的权值
  133. for (i = ; i >= ; i--)//此时计算的是阶码
  134. {
  135. if (Num[i] == '')
  136. exponent += d;
  137. d *= ;
  138. }
  139. if (exponent >= )
  140. exponent -= ;//将阶码转换为指数
  141. else
  142. {
  143. exponent += ;//补上指数变阶码溢出的最高位
  144. exponent -= ;//阶码变指数,指数为补码
  145. exponent = - (exponent - );//(exponent-128)去符号位,在讲补码变为指数绝对值
  146. exponent = exponent * (-);//最终指数部分
  147. }
  148.  
  149. if (Num[] == '')//浮点数符号位为1,说明为负数
  150. f = f * (-);
  151.  
  152. f = f * Math.Pow(, exponent);//将小数部分和浮点部分组合
  153.  
  154. return f;
  155. }
  156. }

综上:串口数据发送接收是比较简单的,难点在于数据类型转换。

需要怎么转换成字节发送出去,再如何接收字节转换成所需数据。

C# ---- 串口数据YSI实例的更多相关文章

  1. [分享]我的LABVIEW快速开发串口测试软件实例

    LABVIEW是美国国家仪器公司(National Instruments,简称NI)的创新产品,它允许编程人员使用图形方式来进行编程,摒弃了艰涩难懂的代码,只需要拖动相应图形控件然后连线,进行简单的 ...

  2. 基于MQTT的串口数据转发器

    问: ComHub能做什么?ComHub使用MQTT协议,将串口数据经TCP分发出去.这种结构可以实现很多功能:1.COM-Over-TCP: 将COM数据使用TCP远程传送;2.COM多播:一个CO ...

  3. C#SerialPort如何读取串口数据并显示在TextBox上

    SerialPort中串口数据的读取与写入有较大的不同.由于串口不知道数据何时到达,因此有两种方法可以实现串口数据的读取.一.线程实时读串口:二.事件触发方式实现. 由于线程实时读串口的效率不是十分高 ...

  4. Android(Linux)实时监控串口数据

    之前在做WinCE车载方案时,曾做过一个小工具TraceMonitor,用于显示WinCE系统上应用程序的调试信息,特别是在实车调试时,用于监控和显示CAN盒与主机之间的串口数据.因为需要抢占市场先机 ...

  5. seo之google rich-snippets丰富网页摘要结构化数据(微数据)实例代码

    seo之google rich-snippets丰富网页摘要结构化数据(微数据)实例代码 网页摘要是搜索引擎搜索结果下的几行字,用户能通过网页摘要迅速了解到网页的大概内容,传统的摘要是纯文字摘要,而结 ...

  6. C#中使用SendMessage在进程间传递数据的实例

    原文:C#中使用SendMessage在进程间传递数据的实例 1 新建解决方案SendMessageExample 在解决方案下面新建三个项目:CopyDataStruct,Receiver和Send ...

  7. STM32—无需中断来实现使用DMA接收串口数据

    本节目标: 通过DMA,无需中断,接收不定时长的串口数据 描述:当在串口多数据传输下,CPU会产生多次中断来接收串口数据,这样会大大地降低CPU效率,同时又需要CPU去做其它更重要的事情,我们应该如何 ...

  8. [转]WEB页获取串口数据

    本文转自:https://www.cnblogs.com/rockyhm/p/3434200.html 最近做一个B/S的项目,需要读取电子秤的值,之前一直没做过,也没有经验,于是在网上找到很多  大 ...

  9. WEB页获取串口数据

    最近做一个B/S的项目,需要读取电子秤的值,之前一直没做过,也没有经验,于是在网上找到很多  大致分两种 使用ActiveX控件,JS调用MSCOMM32.dll的串口控件对串口进行控制 使用C#语言 ...

随机推荐

  1. HDD-FAT32 ZIP-FAT32

    在使用U当家U盘启动盘制作工具的时候会看到一个模式的选项,模式分为HDD-FAT32和ZIP-FAT32两个常用的模式,其它的模式几乎用不到的.那么HDD-FAT32和ZIP-FAT32模式到底有什么 ...

  2. 真实故事:网站遭遇DOS攻击

     网站遭遇DOS攻击 一个.事件背景 长假对于IT人员来说是个短暂的休整时期,可IT系统却一时也不能停.越是节假日,越可能出大问题,以下要讲述的就是一起遭受DOS攻击的案例. 春节长假刚过完,小李 ...

  3. DNA和纳米(Nano)Fusion技术的发展趋势

    细观国内外有关DNA与Nano技术的报道.不得不承认存在不小的差距,并且差距有继续拉大的趋势. 在我们国内,DNA技术是作为遗产基因来对待的.引用的有关中文參考资料一般比較陈旧.缺少參考价值.在发达国 ...

  4. BZOJ 2588 Count on a tree (COT) 是持久的段树

    标题效果:两棵树之间的首次查询k大点的权利. 思维:树木覆盖树,事实上,它是正常的树木覆盖了持久段树. 由于使用权值段树可以寻求区间k大,然后应用到持久段树思想,间隔可以做减法.详见代码. CODE: ...

  5. T-SQL问题解决集锦——数据加解密(2)

    原文:T-SQL问题解决集锦--数据加解密(2) 问题三.如何让指定用户可以对数据表进行Truncate操作? Truncate在对大表全删除操作时,会明显比Delete语句更快更有效,但是因为它不需 ...

  6. tornado的GET POST方法样品展示

    举例说明get和post该方法的用途: 一.演示样例用的GET方法: import tornado.ioloop import tornado.web class MainHandler(tornad ...

  7. web自定义炫酷字体

    电脑有已经安装好的字体,但是如果你有特殊需要而要选择其他字体,则需要以下几个步骤 1.寻找适合你的字体 有下面几个站点提供字体下载: www.theleagueofmoveabletype.com w ...

  8. 如何获得 oracle RAC 11g asm spfile S档

     方法一: [root@vmrac1 ~]# su - grid [grid@vmrac1 ~]$ sqlplus / as sysasm SQL*Plus: Release 11.2.0.3.0 ...

  9. Shell 文字 顶替tomcat星团war包裹

    执行前server造成免费ssh登陆. 修改配置文件不是太大 您可以覆盖原有的配置 profile 简介 bak=/home/wsm/bak webapps=/home/wsm/webapps/WSM ...

  10. 据序和中序序列或者也许为了一个二进制序列,恢复二进制和打印图像(c语言)

    首先要预购和序,以恢复它: 1.首先,我们使用的是递归的方式来完成 2.递归的最小单位:一个空的树和书的前言和第一序.该序列的第一个元素是树的第一序列根,调用这种方法 3.递归的终止条件是.当这棵树的 ...