㈠ 如何用串口發送數據包
當然可以。串口助手裡設置好就行。比如這樣設置:波特率9600,數據位8,停止位1,校驗為:奇校驗、偶校驗、標志位....任選其一。停止位:1.
單片機里按同樣設置就行。
11位是一個位元組,加了開始位,停止位,還有一個TB8,多機通信地址和數據通信區分位,不是一幀,確切的說是一個位元組
樓主概念錯誤。串口通訊里叫幀,是指完成一次完整的數據傳送。一幀里可以包含多個位元組(同步通訊),也可以包含一個位元組。比如包含了開始位,停止位,還有一個多機通信地址和數據通信區分位TB8的一次非同步發送叫一幀。其中有效的信息是一個位元組。
單片機工作在方式3,波特率9600,一個開始位,一個停止位,一個TB8區分地址和數據標志位,沒有校驗位的,校驗用的是CRC16的,在串口調試助手裡的設置:波特率9600,一個開始位,一個停止位,校驗方式設為「無」,為什麼沒有數據返回呢?在系統里就有數據返回,有人說串口調試助手只能調試8位的數據,而單片機工作在方式3,增加一個TB8位,總共是九位數據,所以串口調試助手調試不了,是這樣嗎?
你校驗方式設置錯了啊!咋能設置成
無
呢?
你是要看單片機有沒有回傳數據對吧?先看發送的是地址還是數據,再看你的SM2位咋個弄的。總之確信單片機程序沒錯啦,也就是確信有回傳數據了,把校驗方式設置成:mark.再看。
㈡ 如何將串口二得到的數據,通過串口一發出去
首先,獲取單片機和串口屏的通信協議;
其次,在PC中編寫串口通信軟體,分別控制兩個設備即可;
調試的時候,可以先用現有的串口助手類軟體如串口調試助手,或者自定義協議功能的通信軟體如格西烽火,測試和驗證你定義的協議。
㈢ 如何向串口發送數據,並接收串口發來的數據
您好,設備端和控制端連接好,控制端有接收發送數據的軟體,那麼就可以直接接收發送數據。如果有協議限制,匹配相應的協議即可。
㈣ STM32初學者求助!串口問題:如何用串口2接收數據,然後再由串口1發送出去
最簡單就建個數組當緩沖區,串口2中斷接收,串口1判斷緩沖區只要有數據就發送,發送時計數器或指針移位的過程最好屏蔽中斷。
㈤ STC12C5A60S2單片機的串口2發送數據問題
在PUDN 上找一個程序吧,很多這款單片機的,也有串口2的程序
㈥ 如何將串口二得到的數據,通過串口一發出去
void USART2_IRQHandler(void)
{
u8 Res;
int i;
if(USART_GetITStatus(USART2,USART_IT_RXNE))
{
Res =USART_ReceiveData(USART2);
USART_SendData(USART1,Res);
while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);
}
}
你可以試試看這個代碼
㈦ 串口發送與接收數據
使用RS-485串口進行通訊。
1.定義串口接收數據的緩沖區,最大可以保存64個位元組 u8 RS485_RX_BUF1[64];
2.定義接收發送數據的長度 u8 RS485_RX_CNT;
3.發送數據的函數一般有兩個printf和 USART_SendData,這里主要說USART_SendData的使用。printf實現的是格式化字元串,字元串比較有優勢。
USART_SendData傳遞單個字元和指令。
4.給發送方定義一個標記位 u32 flags_send1; flags_send1
5.要發送的事件很多定義一個枚舉類型的數據,將所有要發送的事件放入枚舉類型數據中。
枚舉類型數據將第一個定為1,其他的數據依次加1.
6.定義一個發送事件函數SendCmd(u8 cmd)
定義
7.假設要傳遞E_CKEYDN_INUSE1事件,要實現事件的傳遞,就應該將事件做參數傳入SendCmd(u8 cmd)函數
此時flags_send1 |= EBIT(9)=;由第四點知道flags_send1是一個32位的無符號整型數據。所以 flags_send1 = 0000 0000 0000 0000 0000 0001 1111 1111
8.(1)UARTSend1()函數
此時的flags_send1 = 0000 0000 0000 0000 0000 0001 1111 1111;
sb[2] = (flags_send1 >> 0) & 0xff = 1111 1111;
sb[3] = (flags_send1 >> 8) & 0xff = 0000 0001;
sb[4] = (flags_send1 >> 16) & 0xff = 0000 0000;
sb[5] = (flags_send1 >> 24) & 0xff = 0000 0000;
(2)checksum()函數
d0=(senddata >> 0) & 0xff=0000 0001 1111 1111;
d1=(senddata >> 8) & 0xff=0000 0001 & 0xff=0000 0000 0000 0001;
d2=(senddata >> 16) & 0xff=0000 0000 & 0xff = 0000 0000 0000 0000;
d3=(senddata >> 24) & 0xff=0000 0000 & 0xff = 0000 0000 0000 0000;
sum=0000 0010 0000 0000;
~sum=1111 1101 1111 1111;
sb[6] = (sum >> 0) &0xff = 1111 1111 & 0xff = 1111 1111 ;
sb[7] = (sum >> 8) &0xff = 1111 1101;
(3)
為什麼定義sb[8]的前兩位是0x55,0xaa?
0xaa是1010 1010,0x55是0101 0101在通訊編碼原理中,應該避免過多的重復0或者1,因為當傳輸變成一個長0/1時,一個脈沖干擾就會將數據截斷,增加誤碼的概率。若通訊機不能接受10101010或者01010101,那麼就是線路出現問題。這是一個判斷線路狀態的手段。
9.串口1接收數據
(1)通過UARTRead1()函數實現
receive += (RS485_RX_BUF1[2] << 0) = 0000 0000 0000 0000 0000 0000 1111 1111; ;
receive += (RS485_RX_BUF1[3] << 8) = 0000 0000 0000 0000 0000 0001 1111 1111
receive += (RS485_RX_BUF1[4] << 16) = 0000 0000 0000 0000 0000 0001 1111 1111
receive += (RS485_RX_BUF1[5] << 24) = 0000 0000 0000 0000 0000 0001 1111 1111
(2)將receive傳入checksum(u32 senddata)函數中
d0= 0000 0000 1111 1111;
d1=0000 0000 0000 0001
d2= 0000 0000 0000 0000
d3=0000 0000 0000 0000
sum=0000 0001 0000 0000
~sum = 1111 1110 1111 1111
(3)定義接收數據標記位是 u32 flags_receive1;
通過判斷RS485_RX_BUF1[6] 、RS485_RX_BUF1是否等於 ((sum >> 0) & 0xff)、((sum >> 8) & 0xff))來判斷讀入的數據是不是正確的。
RS485_RX_BUF2[6] ==1111 1111
RS485_RX_BUF2[7] == 1111 1110
正確時
接收到的數據是flags_receive1 = receive= 0000 0000 0000 0000 0000 0001 1111 1111;
不正確時 flags_receive1 |= EBIT(E_ERROR); 接收數據標記位置為錯誤位。