原文: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实例的更多相关文章

  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. POJ 3414--Pots(BFS+回溯路径)

    Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9963   Accepted: 4179   Special Ju ...

  2. 使用一个T-SQL语句批量查询数据表占用空间及其行数

    原文:使用一个T-SQL语句批量查询数据表占用空间及其行数 要找到数据库中数据表占用的空间和存在的行数.可以使用sp_spaceused搭配数据表的名称.就可以产生该表耗用的空间和现有行数. 如: U ...

  3. LVM 命令集总结(转)

    PV 命令 下面的命令是在与物理卷相关的操作中最常用的命令: lsdev 列出ODM中的设备. chdev 修改设备的特征. mkdev 增加一个设备到系统中. chpv 修改物理卷的状态. lspv ...

  4. 解决一bug的流程复盘

    听同事说有一个功能不好使了,当时有事,过了一段时间来看看这个bug 解决问题时,看的是老的日志,根据老日志看来看去没有发现问题,觉得很困惑 然后手动执行了一下,发现问题没有重现.与另一个团队的同事沟通 ...

  5. IE浏览器兼容性问题解决方法

    如何用一行代码来解决CSS各种IE各种兼容性问题 一行代码来解决CSS在,IE6,IE7,IE8,IE9,IE10 各种兼容性问题. 在站点前端写代码的过程中,非常多时间IE各个版本号的兼容问题非常难 ...

  6. MPQ Storm库 源代码分析 一个

    MPQ什么? MPQ维基上说的非常明确. 简而言之,它是暴雪公司用于游戏数据打包的工具.星际争霸,魔兽争霸游戏中都有使用.该工具内含游戏资源加密和压缩等功能.         git下载地址:http ...

  7. 新秀翻译(两)——使用Java通用配置模板方法模式

    假设你发现你已经非常重码,你可能会考虑使用模板的方法来消除easy重复错误代码.下面是一个示例:以下两类,他完成了几乎相同的功能: 实例化并初始化一个Reader来读取CSV文件. 读取每一行并解析: ...

  8. python 基础知识点整理 和详细应用

    Python教程 Python是一种简单易学,功能强大的编程语言.它包含了高效的高级数据结构和简单而有效的方法,面向对象编程.Python优雅的语法,动态类型,以及它天然的解释能力,使其成为理想的语言 ...

  9. 随笔 - Internet缓存文件

    Internet缓存文件 本文地址: http://blog.csdn.net/caroline_wendy 互联网上全部的使用记录, 图片, 音乐, 视频, 都会缓存在本地. 1. 位置: IE-& ...

  10. 集成 Entity Framework

    ABP 基础设施层——集成 Entity Framework 本文翻译自ABP的官方教程<EntityFramework Integration>,地址为:http://aspnetboi ...