串口不能接收16进制数
发布: 2009-6-15 23:06 | 作者: 无雪 | 来源: StmFans思蜕盟 OPELC 自由电子联盟
#include "STM32F10x_LIB.H"
void RCC_Configuration(void)//时钟设置
{
//使能UART1时钟和A口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
}
void GPIO_Configuration(void) //IO口设置 PA9.10是默认的USART1接口
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //选择引脚0,1 (选择相应的管脚)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出频率最大50M(设置输出的频率)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //带上拉输出 (设置为何种输出或何种输入)
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA0,1引脚
}
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure; //串口参数初始化
//初始化参数设置
USART_InitStructure.USART_BaudRate = 9600; //波特率9600
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //一位停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//打开Rx接收和Tx发送功能
USART_Init(USART1, &USART_InitStructure); //初始化
USART_Cmd(USART1, ENABLE); //启动串口
}
int main()
{
u16 i=0;
RCC_Configuration(); //时钟初始化
GPIO_Configuration();//IO口初始化
USART_Configuration();//串口初始化
while(1)
{
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);//等待接收完毕
i =(USART_ReceiveData(USART1));//把接收到的数据赋给i
if(i==2)
GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
}
当我通过串口用16进制数发送2给板子时接收不到!!
请那位懂得帮忙解决一下
void RCC_Configuration(void)//时钟设置
{
//使能UART1时钟和A口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
}
void GPIO_Configuration(void) //IO口设置 PA9.10是默认的USART1接口
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //选择引脚0,1 (选择相应的管脚)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出频率最大50M(设置输出的频率)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //带上拉输出 (设置为何种输出或何种输入)
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA0,1引脚
}
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure; //串口参数初始化
//初始化参数设置
USART_InitStructure.USART_BaudRate = 9600; //波特率9600
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //一位停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//打开Rx接收和Tx发送功能
USART_Init(USART1, &USART_InitStructure); //初始化
USART_Cmd(USART1, ENABLE); //启动串口
}
int main()
{
u16 i=0;
RCC_Configuration(); //时钟初始化
GPIO_Configuration();//IO口初始化
USART_Configuration();//串口初始化
while(1)
{
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);//等待接收完毕
i =(USART_ReceiveData(USART1));//把接收到的数据赋给i
if(i==2)
GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
}
当我通过串口用16进制数发送2给板子时接收不到!!
请那位懂得帮忙解决一下

我用16进制数发个2,总是检测不到接收了2 。
我用其他形式发送字符,就可以接收到。
假如我用字符形式发送2给板子,板子再把接收到的数发到串口调试助手,调试助手也能收到2,但板子中检测收到的数据的程序检测不到收到2
能进中断吗?如果能进中断,看看收到的到底是什么?
另:我的程序都是按照16进制发的,顺便再说一句,不管你按照几进制发,最终都是二进制
哈哈!
但是用16进制发就不行,
其他形式发的检测到的是ASCII码!
QUOTE:
没图没真相,把串口调试助手发16进制数时的界面截个图发上来看看。QUOTE:
为何发笑???我说错了吗?
按照楼主的方式,我在编辑框里写了个2,注意是单纯的2,以十六进制发送,不管怎么发都不行,下面是串口监视到得:
这里两次都写出都是是空白
000075: 20.06.2009 01:56:27.578 +0.0
000081: 20.06.2009 01:56:39.156 +0.0
原因可能是这样的,声明:只是本人的理解,若有任何疑问,请参见我的签名!
看了一个串口调试助手的发布说明,验证了我的想法
一个不错的PC串行调试工具软件,具有串行口的设置、串行数据接收、发送等诸多功能。
可配合实验四在PC端使用。
使用注意:
1、串口设为COM1或COM2,实际取决于实验系统与PC的连接口。
2、波特率设为19200bps,当通信双方的速度不一致时会出现乱码。
3、选择十六进制显示、发送,默认为ASCII码。(这里说明,其实十六进制发送,是先按照ASCII码读取的)
4、不要与SD-1实验软件同时打开,不然会造成串口使用冲突。
5、该软件不支持回车、退格等部分控制字符。
软件下载:串口调试助手V2.2.rar
怀疑楼主用的就是这个调试助手
建议楼主去做个试验,把2改成02,如果还不行,你打我都不犟!
QUOTE:
我确认他发的是个控制字符Bin Dec Hex 缩写/字符 解释
0000 0010 2 02 STX (start of text) 正文开始
绝对不是0x02
现在又出现来新的问题!
如果我改用重定义的printf函数给调试助手发数据时显示的都是空白!
但不用printf直接用USART又没问题了!不知道是什么原因?
QUOTE:
靠,笑的我一身冷汗,检查了一遍又一遍