原文: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. unix pwd使用命令

    [语法]:     pwd [说明]:    此命令会显示当前的工作文件夹 []: pwd     这显示当前工作文件夹 版权声明:本文博主原创文章.博客,未经同意不得转载.

  2. hive的udf制剂

    1.配置环境 1.介绍jar包裹:hive-exec-0.8.0.jar 和 hadoop-core-0.20.2.jar 2.书写udf性能 1.extends UDF 2.又一次定义UDF的eva ...

  3. nginx+tomcat实现动静分离(转)

    本文设计的动静分离结构 在本文中,我们将静态资源放在 A 主机的一个目录上,将动态程序放在 B 主机上,同时在 A 上安装 Nginx 并且在 B 上安装 Tomcat.配置 Nginx,当请求的是 ...

  4. Task的异步模式

    Task的异步模式 返回该系列目录<基于Task的异步模式--全面介绍> 生成方法 编译器生成 在.NET Framework 4.5中,C#编译器实现了TAP.任何标有async关键字的 ...

  5. C#使用ServiceController控制windows服务

    C#在,使用ServiceController控制类windows服务,添加首次使用前引文:System.ServiceProcess,空间中引用:using System.ServiceProces ...

  6. java 正则表达式提取html纯文本

    本文来自我的个人博客: java 正则表达式提取html纯文本 做内容的大家都知道,从html中直接提取纯文本是一个非常大的问题.现将我做的正则匹配贴上: import java.util.regex ...

  7. Windows Phone APP中禁用截图

    原文:Windows Phone APP中禁用截图 Windows Phone 8 有系统自带的截图功能,快捷键:电源键+Win键,可以随意截图. Windows Phone 更新GDR2后新增了一个 ...

  8. bzoj 2109 &amp; 2535 空中管制 解读

    [] [分析]小猪真的是一个很好的问题.我认为这是一个问题洪水.建立拓扑后(便! ).直接把最外层设定序号为1,第二层为2.bfs下去就可以. . . 结果发现:飞行序号不能同样.. . 于是開始想. ...

  9. System.arraycopy--findbugs检查引发的更改

    EI2: This code stores a reference to an externally mutable object into the internal representation o ...

  10. linux终奌站 信息 格式 更改 /etc/bashrc

    gedit /etc/bashrc shell环境下默认的特殊符号意义: \d :代表日期,格式为weekday month date,比如:"Sun Sep 18" \H :完整 ...