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;
uj5u.com熱心網友回復:
一下使用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);//發送資料到控制元件
}
uj5u.com熱心網友回復:
聽說這個很香int a = Convert.ToInt32("12345678", 16);
uj5u.com熱心網友回復:
float get;
char *p;
p = (char*)&get;//強制轉換F0 FB 9F 46
如上,我在C++里面是把float指標轉為了CHAR,就是把float的四個位元組,只取了第一個位元組傳入char,
在C#種也要如此吧
uj5u.com熱心網友回復:
我的串口回傳值是一個結構體,里面包含了電壓電流,電機轉速等資訊,總共44個位元組,轉速資訊占4個位元組。比如我現在提取出某一時刻的轉速資訊為 ACFC44E4,想把它轉成我要的看得明白的轉速,轉換出來應該是2048左右,轉速資訊在結構體中是float型的uj5u.com熱心網友回復:
其實我覺得沒有必要,問題簡單化:就是把串口傳過來的四個位元組的字串轉為int型別
uj5u.com熱心網友回復:
聽說這個很香
int a = Convert.ToInt32("12345678", 16);
float get;
char *p;
p = (char*)&get;//強制轉換F0 FB 9F 46
如上,我在C++里面是把float指標轉為了CHAR,就是把float的四個位元組,只取了第一個位元組傳入char,
在C#種也要如此吧
其實我覺得沒有必要,問題簡單化:就是把串口傳過來的四個位元組的字串轉為int型別
比如我串口回傳的是ACFC44E4,它實際對應的電機轉速是2048左右,按照你那個轉為int的話那就不止了
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/77831.html
標籤:C#
