方法一:
直接把float數據拆分為4個unsigned char(由於數字沒法拆分,所以只能用指針的),發過去,在合併為float。
其中有兩點要注意。
(1)大端存儲,小端存儲;如果搞錯讀取數據就不是你接收的數據地址(我主要使用了fpga,arm以及PC機,很有可能存儲方式不同,一般可能不需要考慮)
(2)字對齊。不然就合併不成float(我先前沒注意直接一個很怪異的數據)
發送端
void package_frame(const void *data)
{
int i;
for(i=0; i<4; i++)
{
send_frame[i] = ((uchar *)data)[i];
}
}
將float data數據拆分成uchar後存儲在數組send_frame[]發送。
float exchange_data(uchar *data)
{
float float_data;
float_data = *((float*)data);
return float_data;
}
將uchar *data首地址付給float_data來合併成float型數據(記得字對齊和大小端存儲,不然數據不對)
其實發整數等大於1位元組的數據也一樣。
方法二:
讀取的adc數據寄存器的值不*3.3V(或5V)除以2的N次方,直接把這個數據發到上位機,在上位機程序裡再*3.3V除以2的N次方。
這樣就避免了傳遞浮點數的麻煩。
推薦閱讀
。關於DMA的介紹我們僅介紹到這裡,如果需要更詳細的了解DMA原理 DMA寄存器以及庫函數 可以參考這篇文章《【STM32】 DMA原理,步驟超細詳解,一文看懂DMA》下面我們將介紹CubeMx 如何創建DMA具體流程如下:我們以USART1 的DMA傳輸為例工程創建1設置RCC設置高速外部時鐘HSE 選擇外部時鐘源2設置串口1點擊USATR12設置MODE為異步通信(Asynchronous)3基礎參數:波特率為115200 Bits/s。傳輸數據長度為8 Bit。奇偶檢驗無,停止位1 接收和發送都使能4GPIO引腳自動設置 USART1_RX/USART_TX5 NVIC Settings 一欄使能接收中斷關於串口部分的講解可以參考
發表於 2020-05-12
1200bps//11.0592MHz 0xfa 9600bps//0xf4 11.0592MHz 0xf3 12MHz 4800bps//均在SMOD=1的情況下(波特率倍增模式)*******************************///串口發送函數void PutString(unsigned char *TXStr) { ES=0; while(*TXStr
發表於 2020-05-12
/*********************程序功能:接收上位機發過來的一個字符串,然後把該字符串發送給上位機, 字符串必須以!結尾**********************/#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit LED = P2^7;uchar flag = 0;uchar index = 0;uchar data c[100];void Delay_ms(uint n){ uchar i; while(n--) for(i = 0;i
發表於 2020-05-12
先說幾句,一直都沒有對STM8的串口應用進行總結,最近小結一下。STM8應用庫來開發,在基本的串口的應用上,我自己的理解現在還很不到位。我本以為STM8的串口也會有查詢發送、中斷發送、查詢接收、中斷接收這樣幾種方法呢~!可事實上我現在對於中斷發送這路模式還沒太搞明白,與51單片機的串口工作還是有區別的。STM8提供了發送中斷和發送完中斷,我自己的理解是,在發送時進入中斷和發送一個字節完成時進行中斷。這與我大腦中理解的串口中斷還是不一樣的,回頭要繼續把這裡搞明白。一般情況下,STM8的串口多數是用查詢發送,中斷接收,這樣來做。使用串口前要如下幾點:1.配置TX和RX的GPIO管腳狀態2.初始化串口,這裡要打開串口設備的時鐘,配置串口
發表於 2020-03-28
//******************************************************************************// MSP430x24x Demo - USCI_A0, 9600 UART Echo ISR, DCO SMCLK//// 實驗效果說明:首先發送一個數組的數據到PC,然後接受PC發送來的數據,在發送到// PC機上。// Baud rate divider with 1MHz
發表於 2020-03-23
因為我需要做9600波特率的串口通信,所以外部接的是11.0592MHz的晶振。時鐘初始化程序如下:void Clock_init() { CLK_DeInit(); CLK_HSECmd(ENABLE); //啟用外部時鐘 while(SET!=CLK_GetFlagStatus(CLK_FLAG_HSERDY)); //等待外部時鐘啟動 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); //1分頻 
發表於 2020-03-08