原文: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. Shell学问: 调用脚本之间

    于Java,Python于,您可以使用import该方法使脚本或模块之间的呼叫,例如: >>> import math >>> math.sqrt(4) 2.0 在 ...

  2. Machine Learning—Linear Regression

    Evernote的同步分享:Machine Learning-Linear Regression 版权声明:本文博客原创文章.博客,未经同意,不得转载.

  3. EF6操作Sqlite数据库的项目兼容性问题

    vs2010无法正确打开2015创建的项目里面操作Sqlite数据库时使用EF6创建的edmx文件(会显示空白)   但是可以正常查询 vs2015无法正确打开2010创建的项目里面操作Sqlite数 ...

  4. codeforces 260 div2 A,B,C

    A:水的问题.排序结构.看看是否相同两个数组序列. B:他们写出来1,2,3,4,的n钍对5余.你会发现和5环节. 假设%4 = 0,输出4,否则输出0. 写一个大数取余就过了. B. Fedya a ...

  5. Windows Phone 独立存储资源管理器工具

    如何使用独立存储资源管理器工具 http://msdn.microsoft.com/zh-CN/library/hh286408(v=vs.92)C:\Program Files (x86)\Micr ...

  6. 开源GUI-Microwindows之程序入口分析

    **************************************************************************************************** ...

  7. DP Leetcode - Maximum Product Subarray

    近期一直忙着写paper,非常久没做题,一下子把题目搞复杂了..思路理清楚了非常easy,每次仅仅需更新2个值:当前子序列最大乘积和当前子序列的最小乘积.最大乘积被更新有三种可能:当前A[i]> ...

  8. jvm在存储区域

    当区域执行的数据  JVM存储器的管理分为几个时间之后的数据区的实施:程序计数器.JavaVM栈.本地方法栈.Java堆.方法区(包括常量池的实现).   程序计数器 较小的内存空间,能够看作是当前线 ...

  9. Android特效 五种Toast具体解释

    Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,并且Toast显示的时间有限,过一定的时间就会自己主动消失. 1.默认效果: 代码: Toas ...

  10. java回调机制及其实现(转)

    1. 什么是回调函数 回调函数,顾名思义,用于回调的函数.回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数.回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机.回调 ...