原文: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. [SignalR]一个简单的聊天室

    原文:[SignalR]一个简单的聊天室 1.说明 开发环境:Microsoft Visual Studio 2010 以及需要安装NuGet. 2.添加SignalR所需要的类库以及脚本文件: 3. ...

  2. jQuery.reveal弹出层

    jQuery.reveal弹出层使用 最近用到弹出层,还得自定义UI,原本用的artDialog太庞大,不合适了,于是就找到了这个东西,又小又好用,基础的弹出遮罩都有了,想要什么还不是Coder自己说 ...

  3. HTML5分析实战WebSockets基本介绍

    HTML5 WebSockets规范定义了API,同意web使用页面WebSockets与远程主机协议的双向交流. 介绍WebSocket接口,并限定了全双工通信信道,通过套接字网络.HTML5 We ...

  4. IIS ASP.NET 版本转换批处理代码

    原文 IIS ASP.NET 版本转换批处理代码 用来转换asp.net版本的代码,需要的朋友可以参考下. 标识符的查看方法:iisaspnet.bat代码 复制代码代码如下: @echo off e ...

  5. POJ - 2828 Buy Tickets (段树单点更新)

    Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...

  6. 好记心不如烂笔头,ssh登录 The authenticity of host 192.168.0.xxx can&#39;t be established. 的问题

    用ssh登录一个机器(换过ip地址),提示输入yes后,屏幕不断出现y,仅仅有按ctrl + c结束 错误是:The authenticity of host 192.168.0.xxx can't ...

  7. 纯CSS3实现的图片滑块程序 效果非常酷

    原文:纯CSS3实现的图片滑块程序 效果非常酷 之前我们经常会看到很多利用jQuery实现的焦点图插件,种类太多了,今天我想给大家分享一款利用纯CSS3实现的图片滑块应用,完全是利用CSS3的相关特性 ...

  8. 《Java并发编程实战》第十四章 构建自己的同步工具定义 札记

    一.状态依赖性的管理 有界缓存实现的基类 @ ThreadSafe public abstract class BaseBoundedBuffer<E> { @GuardeBy( &quo ...

  9. AssetManager asset使用

    Android 该系统提供了一个程序为每个新的设计/assets文件夹.保存该文件在此文件夹可以在一个程序被打包./res 和/assets所不同的是,android不/assets下生成的文件ID. ...

  10. FFmpeg 协议初步学习

    typedef struct URLContext { const AVClass *av_class; /**< information for av_log(). Set by url_op ...