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#语言 ...
随机推荐
- StackExchange.Redis 使用-发布订阅 (二)
使用Redis的发布订阅功能 redis另一个常见的用途是发布订阅功能 . 它非常的简单 ,当连接失败时 ConnectionMultiplexer 会自动重新进行订阅 . ISubscriber s ...
- C# 闭包问题
C# 闭包问题-你被”坑“过吗? 引言 闭包是什么?以前看面试题的时候才发现这个名词. 闭包在实际项目中会有什么问题?现在就让我们一起来看下这个不太熟悉的名词. 如果在实际工作中用到了匿名函数和lam ...
- WPF学习(11)2D绘图
本篇我们来学习WPF的绘图,在2D绘图中主要有这么几个重要的类:Drawing.Visual和Shape,顺便讲下Brush和BitmapEffect. 1 2D绘图 1.1Drawing类 Draw ...
- Java Web项目结构
Java Web项目结构(一般) 1.Java src 2.JRE System Library 3.Java EE 6 Libraries 4.Web App Libraries 5.WebRoot ...
- iOS一个开发系列中 - UIButton 使用摘要
// 初始化button并设置类型 UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; // 可以定义的UIButto ...
- [SignalR]在非Hub继承类中使用脚本方法
原文:[SignalR]在非Hub继承类中使用脚本方法 新建一个普通类OutHub,里面包含一个脚本方法OutHubTest. 因为大家知道,若能让脚本调用到的话,必须继承Hub,那怎么实现了?通过G ...
- Javascript设计模式与开发实践读书笔记(1-3章)
第一章 面向对象的Javascript 1.1 多态在面向对象设计中的应用 多态最根本好处在于,你不必询问对象“你是什么类型”而后根据得到的答案调用对象的某个行为--你只管调用行为就好,剩下的一切 ...
- 选中文件夹设定为IIS站点主目录的批处理bat
原文:选中文件夹设定为IIS站点主目录的批处理bat 我使用的OS是winxp,安装的IIS版本为5.1,不支持多站点,下载的一些源代码想测试浏览一下就得设定虚拟目录,而且有些还必须设为站点根目录,每 ...
- ASP.NET AJAX简明教程
当我们谈论Ajax时,首先想到的就是JavaScript下的Ajax,用来完成网页的交互,局部刷新工作,Microsoft的ASP.NET AJAX框架在Web的开发中承担着类似的角色,并简化了Ja ...
- 查询记录rs.previous()使用
查询记录rs.previous()使用 假如查询一个数据表,假设没有记录就显示提示信息.有就所有显示出来查询结果.这时假设是有查询结果的话就须要进行两次查询.第一次查完记录指针指向最后一条记录.開始第 ...