欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
51單片機(jī)串口通信,發(fā)送字符串回顯不全
[打印本頁]
作者:
規(guī)劃胡
時(shí)間:
2026-1-22 20:27
標(biāo)題:
51單片機(jī)串口通信,發(fā)送字符串回顯不全
#include "reg52.h"
#include <string.h>
typedef unsigned int u16;
typedef unsigned char u8;
// ====================== 字符串接收配置 ======================
#define RECV_BUF_LEN 32 // 接收緩存最大長度(可修改)
u8 recv_buf[RECV_BUF_LEN]; // 字符串接收緩存
u8 recv_index = 0; // 接收索引(記錄當(dāng)前緩存位置)
//bit recv_complete = 0; // 字符串接收完成標(biāo)志
bit recv_complete;
// ===========================================================
// 10us延時(shí)函數(shù)
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
// ms延時(shí)函數(shù)(兼容11.0592/12MHz)
void delay_ms(u16 m)
{
u16 i, j;
for(i = m; i > 0; i--)
for(j = 115; j > 0; j--);
}
// 串口初始化:適配兩種晶振的9600波特率
void uart_init(u8 baud_mode)
{
TMOD |= 0X20; // 定時(shí)器1模式2(8位自動(dòng)重裝)
SCON = 0X50; // 串口模式1,允許接收
PCON = 0X00; // SMOD=0,降低波特率誤差
if(baud_mode == 0)
{
TH1 = 0XFD; // 11.0592MHz → 9600
TL1 = 0XFD;
}
else
{
TH1 = 0X66; // 12MHz → 9600
TL1 = 0X66;
}
ES = 1; // 開啟串口中斷
EA = 1; // 開啟總中斷
TR1 = 1; // 啟動(dòng)定時(shí)器1
delay_10us(10); // 串口就緒延時(shí)
}
// 串口發(fā)送單個(gè)字節(jié)(帶超時(shí)容錯(cuò))
void uart_send_byte(u8 dat)
{
u16 timeout = 1000;
TI = 0;
SBUF = dat;
while(!TI && timeout--)
{
delay_10us(1);
}
TI = 0;
}
// 串口發(fā)送字符串(傳入字符串首地址)
void uart_send_string(u8 *str)
{
while(*str != '\0') // 遍歷到字符串結(jié)束符'\0'為止
{
uart_send_byte(*str); // 逐字節(jié)發(fā)送
str++; // 指針后移
delay_10us(1);
}
}
// 串口中斷函數(shù):接收字符串(逐字節(jié)緩存,帶結(jié)束符判斷)
void uart() interrupt 4
{
u8 rec_data = 0;
if (RI) { // 僅處理接收中斷
RI = 0; // 清除接收標(biāo)志
rec_data = SBUF; // 讀取當(dāng)前字節(jié)
// 1. 結(jié)束符判斷(回車/換行視為字符串結(jié)束)
if(rec_data == '\r' || rec_data == '\n')
{
recv_buf[recv_index] = '\0'; // 補(bǔ)充字符串結(jié)束符
recv_complete = 1; // 置接收完成標(biāo)志
recv_index = 0; // 重置索引,準(zhǔn)備下次接收
}
// 2. 未到結(jié)束符且緩存未溢出 → 緩存字節(jié)
else if(recv_index < RECV_BUF_LEN - 1) // 留1位存'\0'
{
recv_buf[recv_index] = rec_data;
recv_index++; // 索引自增
}
// 3. 緩存溢出 → 重置(防程序異常)
else
{
recv_index = 0;
}
}
}
void main()
{
//u8 send_data = 0X30; // 主動(dòng)發(fā)送的單個(gè)字符(數(shù)字0)
uart_init(0); // 11.0592MHz傳0,12MHz傳1
delay_ms(100); // 初始化就緒延時(shí)
memset(recv_buf, 0, RECV_BUF_LEN);
while(1)
{
// 1. 主動(dòng)定時(shí)發(fā)送單個(gè)字符(保留原有功能)
//uart_send_byte(send_data);
//delay_ms(100);
// 2. 檢測到字符串接收完成 → 回發(fā)該字符串
if(recv_complete)
{
uart_send_string("收到字符串:"); // 提示語
if(strcmp((char*)recv_buf, "jj") == 0)
{
uart_send_string(recv_buf);
}
uart_send_string("\r\n");
delay_10us(1);
recv_complete = 0; // 清除完成標(biāo)志
recv_index = 0;
memset(recv_buf, 0, RECV_BUF_LEN);
}
}
}
復(fù)制代碼
發(fā)送jj和發(fā)送加回車換行,uart_send_string(recv_buf);無法正常運(yùn)行,但是取消串口助手的勾選加回車換行,輸入jj\0\n,則整個(gè)代碼正常運(yùn)行,請大佬賜教!!!!
作者:
ydatou
時(shí)間:
2026-1-24 16:37
if(rec_data == '\r' || rec_data == '\n')
{
recv_buf[recv_index] = '\0'; // 補(bǔ)充字符串結(jié)束符
recv_complete = 1; // 置接收完成標(biāo)志
recv_index = 0; // 重置索引,準(zhǔn)備下次接收
}
復(fù)制代碼
問題可能在這,收到'\n'后,緩沖區(qū)為"\0j\0"
作者:
ydatou
時(shí)間:
2026-1-24 17:03
感覺串口發(fā)送沒必要超時(shí)容錯(cuò)。發(fā)送失敗就只和你mcu配置不對相關(guān),和其它無關(guān)。這個(gè)錯(cuò)誤是必須處理的,容錯(cuò)反而不好。串口發(fā)送部分建議用keil官方代碼。
char putchar (char c)
{
while (!TI);
TI = 0;
SBUF = c;
return (c);
}
#define uart_send_byte putchar
void uart_send_string(char *str)
{
while (*str != '\0') // 遍歷到字符串結(jié)束符'\0'為止
{
uart_send_byte(*str++); // 逐字節(jié)發(fā)送
}
}
復(fù)制代碼
作者:
ydatou
時(shí)間:
2026-1-24 17:24
ydatou 發(fā)表于 2026-1-24 16:37
問題可能在這,收到'\n'后,緩沖區(qū)為"\0j\0"
可以先判斷recv_complete再處理接受字符。
也可以收到結(jié)束符時(shí),如ecv_index為0丟棄,否則存入緩存。
void uart_init(u8 baud_mode)
{
TMOD |= 0X20; // 定時(shí)器1模式2(8位自動(dòng)重裝)
SCON = 0X50; // 串口模式1,允許接收
PCON = 0X00; // SMOD=0,降低波特率誤差
if (baud_mode == 0)
{
TH1 = 0XFD; // 11.0592MHz → 9600
TL1 = 0XFD;
}
else
{
TH1 = 0X66; // 12MHz → 9600
TL1 = 0X66;
}
ES = 1; // 開啟串口中斷
EA = 1; // 開啟總中斷
TR1 = 1; // 啟動(dòng)定時(shí)器1
delay_10us(10); // 串口就緒延時(shí)
}
char putchar(char c)
{
while (!TI)
;
TI = 0;
SBUF = c;
return (c);
}
#define uart_send_byte putchar
void uart_send_string(char *str)
{
while (*str != '\0') // 遍歷到字符串結(jié)束符'\0'為止
{
uart_send_byte(*str++); // 逐字節(jié)發(fā)送
}
}
// 串口中斷函數(shù):接收字符串(逐字節(jié)緩存,帶結(jié)束符判斷)
void uart() interrupt 4
{
u8 rec_data = 0;
if (RI)
{ // 僅處理接收中斷
RI = 0; // 清除接收標(biāo)志
if (recv_complete)
return;
rec_data = SBUF; // 讀取當(dāng)前字節(jié)
// 1. 結(jié)束符判斷(回車/換行視為字符串結(jié)束)
if (rec_data == '\r' || rec_data == '\n')
{
if (recv_index)
{
recv_buf[recv_index] = '\0'; // 補(bǔ)充字符串結(jié)束符
recv_complete = 1; // 置接收完成標(biāo)志
recv_index = 0; // 重置索引,準(zhǔn)備下次接收
}
}
// 2. 未到結(jié)束符且緩存未溢出 → 緩存字節(jié)
else if (recv_index < RECV_BUF_LEN - 1) // 留1位存'\0'
{
recv_buf[recv_index] = rec_data;
recv_index++; // 索引自增
}
// 3. 緩存溢出 → 重置(防程序異常)
else
{
recv_index = 0;
}
}
}
復(fù)制代碼
你這代碼比較大的問題是收到的字符串處理期間,不能正常接收字符串。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1