C# 串口通信工具,返回值转换,电机转速反馈

廖大锤 2020-01-11 03:47:14
byte[] byteRead = new byte[serialPort.BytesToRead];
serialPort.Read(byteRead, 0, byteRead.Length);
serialPort.DiscardInBuffer();
string strRcv = null;

if (byteRead.Length > 20)
{
for (int i = 21; i < 25; i++) // 总长44
{
strRcv += byteRead[i].ToString("X2"); //16进制显示 转速21-24

}
Seri_mes_reci.Text += strRcv + "\r\n";
}

这是通过C#串口获取返回值的代码,返回的是44字节的数据,其中一段是我要的转速信息,
就是strRcv 对应的一串4个字节的十六进制的数,请问我怎么样把它转换为实际转速。
以下是我在C++采用的方法,试用过可行
float get;
char *p;
p = (char*)&get;
...全文
165 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
廖大锤 2020-01-11
  • 打赏
  • 举报
回复
引用 5 楼 huakai2418 的回复:
[quote=引用 3 楼 lc1255694986 的回复:] [quote=引用 2 楼 huakai2418 的回复:] 听说这个很香 int a = Convert.ToInt32("12345678", 16);
float get; char *p; p = (char*)&get;//强制转换F0 FB 9F 46 如上,我在C++里面是把float指针转为了CHAR,就是把float的四个字节,只取了第一个字节传入char, 在C#种也要如此吧[/quote] 其实我觉得没有必要,问题简单化:就是把串口传过来的四个字节的字符串转为int类型[/quote] 比如我串口返回的是ACFC44E4,它实际对应的电机转速是2048左右,按照你那个转为int的话那就不止了
huakai2418 2020-01-11
  • 打赏
  • 举报
回复
引用 3 楼 lc1255694986 的回复:
[quote=引用 2 楼 huakai2418 的回复:]
听说这个很香
int a = Convert.ToInt32("12345678", 16);


float get;
char *p;
p = (char*)&get;//强制转换F0 FB 9F 46
如上,我在C++里面是把float指针转为了CHAR,就是把float的四个字节,只取了第一个字节传入char,
在C#种也要如此吧[/quote]
其实我觉得没有必要,问题简单化:就是把串口传过来的四个字节的字符串转为int类型
廖大锤 2020-01-11
  • 打赏
  • 举报
回复
我的串口返回值是一个结构体,里面包含了电压电流,电机转速等信息,总共44个字节,转速信息占4个字节。比如我现在提取出某一时刻的转速信息为 ACFC44E4,想把它转成我要的看得明白的转速,转换出来应该是2048左右,转速信息在结构体中是float型的
廖大锤 2020-01-11
  • 打赏
  • 举报
回复
引用 2 楼 huakai2418 的回复:
听说这个很香 int a = Convert.ToInt32("12345678", 16);
float get; char *p; p = (char*)&get;//强制转换F0 FB 9F 46 如上,我在C++里面是把float指针转为了CHAR,就是把float的四个字节,只取了第一个字节传入char, 在C#种也要如此吧
huakai2418 2020-01-11
  • 打赏
  • 举报
回复
听说这个很香
int a = Convert.ToInt32("12345678", 16);
廖大锤 2020-01-11
  • 打赏
  • 举报
回复
一下使用MFC做的转速提取,想用C#也做一个 void CMFCApplication1Dlg::OnOncommMscomm1() { VARIANT data; COleSafeArray data2; CString strtemp, buffer;// , buffer2; LONG len, i; BYTE Inbyte[2048], temp; //UpdateData(TRUE); //读编辑框内容 if (m_mscomm.GetCommEvent() == 2) //事件值为2表示接收缓冲区内有字符 { data = m_mscomm.GetInput(); //读缓冲区 data2 = data; //VARIANT型变量转换为ColeSafeArray型变量 len = data2.GetOneDimSize(); ////得到有效数据长度 if (len > 0) { for (i = 0; i < len; i++) data2.GetElement(&i, Inbyte + i);//转换为BYTE型数组 for (i = 0; i < len; i++) //将数组转换为Cstring型变量 { temp = *(char*)(Inbyte + i); //字符型 strtemp.Format("%.2x", temp); //将字符送入临时变量strtemp存放 strtemp.MakeUpper(); //用于将CString字符转化为一个大写的字符串 strtemp.Insert(2, " ");//相邻数据间插入空格 buffer += strtemp; //将字符串送入临时变量buffer中存放 } } if (buffer.GetLength() > 120)//44字节,长度为132 { float get; char *p; int sss = buffer.GetLength(); p = (char*)&get;//强制转换F0 FB 9F 46 for (int ii = 0; ii < 4; ii++) { string pre = { buffer[60 + ii * 3] }; string pre2 = { buffer[61 + ii * 3] }; pre += pre2; //cout << "pre:" << pre << endl; int result = 0; for (int i = 0; i < 2; i++) { result += ((charToDigit(pre[i]))*pow(16, 1 - i)); } //cout << "result:" << result << endl; p[ii] = result; } //buffer2.Format("%.3f", get); m_edit10 = get;//变量get为转码后的转速值 UpdateData(FALSE);//发送数据到控件 }

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧