C# ---- 串口数据YSI实例
C#----串口数据接收发送中,发送接收数据已经可以模拟了。
本次YSI实例过程中 主要是:类型转换问题 、计算校验码
一、不同设备不同的规则,本次实例代码如下:
- string serialNumber = sn;//Packet Command Payload
- int i1 = 0x11;//Packet Length Byte
- int i2 = 0xA5;//Packet Sync Byt[]
- string[] strarr = new string[];//命令字符串
- strarr[] = Convert.ToString(i1, );//转化固定字符
- strarr[] = Convert.ToString(i2, );//转化固定字符
- char[] arr = serialNumber.ToCharArray();//字符数组
- int[] ii = new int[];//整形数组,为了计算校验码
- ii[] = i1;//转化固定字符
- ii[] = i2;//转化固定字符
- for (int i = ; i < arr.Length; i++)
- {
- strarr[ + i] = Convert.ToString(arr[i], );
- ii[ + i] = (int)arr[i];
- }
- //计算校验码
- int checksum = ;
- for (int i = ; i < ii.Length; i++)
- {
- checksum += ii[i];
- if (checksum > )
- checksum = checksum - ;
- }
- strarr[] = Convert.ToString(checksum, );
上述,一是采用强制类型转换 char 类型为 16进制int,然后计算校验码;二是将char转换为16进制形式的string。
这样最后就得出需要发送的字符串数组。
二、发送字符串数据并且接收数据,代码如下:
- //计算传输字符串
- string[] sendstr = Sendstr(sdstr);
- //发送字节数组
- byte[] wbb = new byte[];
- //转换成16进制字节
- for (int i = ; i < sendstr.Length; i++)
- {
- wbb[i] = Convert.ToByte(sendstr[i], );
- }
- //接收字节数组
- byte[] rdb = new byte[];
- //打开新的串行端口连接
- sp.Open();
- //丢弃来自串行驱动程序的接受缓冲区的数据
- sp.DiscardInBuffer();
- //丢弃来自串行驱动程序的传输缓冲区的数据
- sp.DiscardOutBuffer();
- //使用缓冲区的数据将指定数量的字节写入串行端口
- sp.Write(wbb, , wbb.Length);
- //当前线程挂起500毫秒
- System.Threading.Thread.Sleep();
- //读取数据超时
- sp.ReadTimeout = ;
- //读取接收数据
- sp.Read(rdb, , rdb.Length);
上述,一是需要转换为字节发送,设备要求16进制字节;二是发送数据后,可以挂起线程500毫秒,避免数据冲突的问题。
这样返回字节数组rdb。
三、接收后的字节数组,需要转换解析,代码如下:
- //读取记录转换为字符串
- string[] rdstr = new string[];
- for (int i = ; i < rdb.Length; i++)
- {
- rdstr[i] = rdb[i].ToString("X2");
- }
上述,先转换为16进制字符串。
四、最终需要收集的数据是浮点型数据
网上搜到一个string 与浮点类型相互转换的类,可以直接使用,代码如下:
- class stConvertFloat
- {
- public static string FloatToStandard(double f, int style)
- {
- char[] Num = new char[];//32为二进制结果加1结束符
- if (f < ) //f为负数 ,符号位Num[0]赋1
- {
- Num[] = '';
- f = f * (-); //转换为整数
- }
- else
- Num[] = '';
- //求指数
- int exponent = ;
- if (f >= )//指数符号为正情况,即fabs(f)>=1
- {
- while (f >= )
- {
- exponent++;
- f = f / ;
- }
- }
- else//负指数情况
- {
- while (f < )
- {
- exponent++;
- f = f * ;
- }
- exponent = ( - exponent) + ;//(128-exponent)为补码,+128是指数符号位置1
- }
- exponent += ;//指数转换为阶码
- int i;
- for (i = ; i >= ; i--)//将指数转换为二进制数
- {
- if (exponent % == )
- Num[i] = '';
- else
- Num[i] = '';
- exponent /= ;
- }
- f = f - ;//小数转换为标准格式
- //求小数部分
- double s = ;
- for (i = ; i < ; i++)
- {
- s /= ;
- if (f >= s)
- {
- //MessageBox.Show(Convert.ToString(s));
- f = f - s;
- Num[i] = '';
- }
- else
- Num[i] = '';
- }
- if (style == )//二进制输出
- {
- string tt = new string(Num);
- return tt;
- }
- else //二进制转换为十六进制
- {
- char sum;
- int j = ;
- for (i = ; i < ; i = i + , j++)
- {
- sum = Convert.ToChar((Num[i] - '') * + (Num[i + ] - '') * + (Num[i + ] - '') * + (Num[i + ] - ''));
- if (sum > )
- Num[j] = Convert.ToChar((sum - ) + 'a');
- else
- Num[j] = Convert.ToChar(sum + '');
- }
- string tt = new string(Num);
- tt = tt.Substring(, );
- return tt;
- }
- }
- public static double StandardToFloat(string FNum, int style)
- {
- char[] Num = new char[];
- char[] Hex = new char[];
- int i, j, value;
- if (style == )//二进制
- {
- for (i = ; i < ; i++)
- Num[i] = FNum[i];
- }
- else//十六进制转换为二进制
- {
- for (i = ; i < ; i++)
- {
- Hex[i] = FNum[i];
- if (Hex[i] >= '' && Hex[i] <= '')
- value = Hex[i] - '';
- else
- {
- Hex[i] = Convert.ToChar(Hex[i] | 0x20); //统一转换为小写
- value = Hex[i] - 'a' + ;
- }
- for (j = ; j >= ; j--)
- {
- Num[i * + j] = Convert.ToChar((value % ) + '');
- value /= ;
- }
- }
- }
- double f = ;//f为最终浮点数结果,标准浮点格式隐含小数点前的1
- double s = ;//s为小数各个位代表的权值
- for (i = ; i < ; i++)//转换小数部分
- {
- s /= ;
- if (Num[i] == '')
- {
- f += s;
- //MessageBox.Show(Convert.ToString(s));
- }
- }
- int exponent = ;//指数部分
- int d = ;//d代表指数部分各位的权值
- for (i = ; i >= ; i--)//此时计算的是阶码
- {
- if (Num[i] == '')
- exponent += d;
- d *= ;
- }
- if (exponent >= )
- exponent -= ;//将阶码转换为指数
- else
- {
- exponent += ;//补上指数变阶码溢出的最高位
- exponent -= ;//阶码变指数,指数为补码
- exponent = - (exponent - );//(exponent-128)去符号位,在讲补码变为指数绝对值
- exponent = exponent * (-);//最终指数部分
- }
- if (Num[] == '')//浮点数符号位为1,说明为负数
- f = f * (-);
- f = f * Math.Pow(, exponent);//将小数部分和浮点部分组合
- return f;
- }
- }
综上:串口数据发送接收是比较简单的,难点在于数据类型转换。
需要怎么转换成字节发送出去,再如何接收字节转换成所需数据。
C# ---- 串口数据YSI实例的更多相关文章
- [分享]我的LABVIEW快速开发串口测试软件实例
LABVIEW是美国国家仪器公司(National Instruments,简称NI)的创新产品,它允许编程人员使用图形方式来进行编程,摒弃了艰涩难懂的代码,只需要拖动相应图形控件然后连线,进行简单的 ...
- 基于MQTT的串口数据转发器
问: ComHub能做什么?ComHub使用MQTT协议,将串口数据经TCP分发出去.这种结构可以实现很多功能:1.COM-Over-TCP: 将COM数据使用TCP远程传送;2.COM多播:一个CO ...
- C#SerialPort如何读取串口数据并显示在TextBox上
SerialPort中串口数据的读取与写入有较大的不同.由于串口不知道数据何时到达,因此有两种方法可以实现串口数据的读取.一.线程实时读串口:二.事件触发方式实现. 由于线程实时读串口的效率不是十分高 ...
- Android(Linux)实时监控串口数据
之前在做WinCE车载方案时,曾做过一个小工具TraceMonitor,用于显示WinCE系统上应用程序的调试信息,特别是在实车调试时,用于监控和显示CAN盒与主机之间的串口数据.因为需要抢占市场先机 ...
- seo之google rich-snippets丰富网页摘要结构化数据(微数据)实例代码
seo之google rich-snippets丰富网页摘要结构化数据(微数据)实例代码 网页摘要是搜索引擎搜索结果下的几行字,用户能通过网页摘要迅速了解到网页的大概内容,传统的摘要是纯文字摘要,而结 ...
- C#中使用SendMessage在进程间传递数据的实例
原文:C#中使用SendMessage在进程间传递数据的实例 1 新建解决方案SendMessageExample 在解决方案下面新建三个项目:CopyDataStruct,Receiver和Send ...
- STM32—无需中断来实现使用DMA接收串口数据
本节目标: 通过DMA,无需中断,接收不定时长的串口数据 描述:当在串口多数据传输下,CPU会产生多次中断来接收串口数据,这样会大大地降低CPU效率,同时又需要CPU去做其它更重要的事情,我们应该如何 ...
- [转]WEB页获取串口数据
本文转自:https://www.cnblogs.com/rockyhm/p/3434200.html 最近做一个B/S的项目,需要读取电子秤的值,之前一直没做过,也没有经验,于是在网上找到很多 大 ...
- WEB页获取串口数据
最近做一个B/S的项目,需要读取电子秤的值,之前一直没做过,也没有经验,于是在网上找到很多 大致分两种 使用ActiveX控件,JS调用MSCOMM32.dll的串口控件对串口进行控制 使用C#语言 ...
随机推荐
- HDD-FAT32 ZIP-FAT32
在使用U当家U盘启动盘制作工具的时候会看到一个模式的选项,模式分为HDD-FAT32和ZIP-FAT32两个常用的模式,其它的模式几乎用不到的.那么HDD-FAT32和ZIP-FAT32模式到底有什么 ...
- 真实故事:网站遭遇DOS攻击
网站遭遇DOS攻击 一个.事件背景 长假对于IT人员来说是个短暂的休整时期,可IT系统却一时也不能停.越是节假日,越可能出大问题,以下要讲述的就是一起遭受DOS攻击的案例. 春节长假刚过完,小李 ...
- DNA和纳米(Nano)Fusion技术的发展趋势
细观国内外有关DNA与Nano技术的报道.不得不承认存在不小的差距,并且差距有继续拉大的趋势. 在我们国内,DNA技术是作为遗产基因来对待的.引用的有关中文參考资料一般比較陈旧.缺少參考价值.在发达国 ...
- BZOJ 2588 Count on a tree (COT) 是持久的段树
标题效果:两棵树之间的首次查询k大点的权利. 思维:树木覆盖树,事实上,它是正常的树木覆盖了持久段树. 由于使用权值段树可以寻求区间k大,然后应用到持久段树思想,间隔可以做减法.详见代码. CODE: ...
- T-SQL问题解决集锦——数据加解密(2)
原文:T-SQL问题解决集锦--数据加解密(2) 问题三.如何让指定用户可以对数据表进行Truncate操作? Truncate在对大表全删除操作时,会明显比Delete语句更快更有效,但是因为它不需 ...
- tornado的GET POST方法样品展示
举例说明get和post该方法的用途: 一.演示样例用的GET方法: import tornado.ioloop import tornado.web class MainHandler(tornad ...
- web自定义炫酷字体
电脑有已经安装好的字体,但是如果你有特殊需要而要选择其他字体,则需要以下几个步骤 1.寻找适合你的字体 有下面几个站点提供字体下载: www.theleagueofmoveabletype.com w ...
- 如何获得 oracle RAC 11g asm spfile S档
方法一: [root@vmrac1 ~]# su - grid [grid@vmrac1 ~]$ sqlplus / as sysasm SQL*Plus: Release 11.2.0.3.0 ...
- Shell 文字 顶替tomcat星团war包裹
执行前server造成免费ssh登陆. 修改配置文件不是太大 您可以覆盖原有的配置 profile 简介 bak=/home/wsm/bak webapps=/home/wsm/webapps/WSM ...
- 据序和中序序列或者也许为了一个二进制序列,恢复二进制和打印图像(c语言)
首先要预购和序,以恢复它: 1.首先,我们使用的是递归的方式来完成 2.递归的最小单位:一个空的树和书的前言和第一序.该序列的第一个元素是树的第一序列根,调用这种方法 3.递归的终止条件是.当这棵树的 ...