我这里买了一个12路超声波模块。该模块采用RS232串口通信,其通讯接口的通讯协议为:通讯参数为波特率9600,无奇偶校验,8个数据位,1个停止位。通过单片机向超声波模块发送控制指令(操作码和数据),操作码为0xb1-0xbc,用于选择测量距离和读数据方式,如0xb1表示最远距离(建议大于2米)索要测量长度数据,不间断返回距离数据,盲区290mm,最远显示距离:3500mm。数据为2位16进制,先高字节,后低字节组成的16位来确定索要哪几个探头数据和机号,其中低12位(0-11)确定索要数据的探头号,高4位(12-15)确定机号,低12位中第n位为1,则n+1号探头需要输出距离数据。例如:0x10 0x35则表示机号为01的模块返回1、3、5、6号探头的数据。
而该超声波模块返回单片机的数据包括通讯字头0xff,操作码0xa1-0xac对应上述表示测量长度的0xb1-0xbc,数据为每个返回探头数据包含3个字节,2位十进制BCD码(先高字节,后低字节,长度单位为mm)+探头号,先从低位探头号开始返回数据。 如单片机向超声波模块发送b1 10 35,则超声波模块返回数据为ff a1 05 20 01 ff a1 08 15 03 ff a1 20 05 05 ff a1 25 35 06代表1号探头距离为520mm,3号为815mm,5号为2005mm,6号为2535mm。 我的程序是主函数给超声波模块发送b1 10 35指令,然后在中断读数据,每读到6个数据就发送到串口1 在PC上显示。 问题是显示的数据是我自己发送的指令,如b1 10 35 b1 10 35这6个数据。 请问大家可以帮我看看什么问题吗,难道不应该我发送指令,这边就返回距离数据吗,怎么我发的指令被读回来了。 谢谢大家了,下面是代码
int fputc(int ch, FILE *f)
{ while((USART1->SR&0X40)==0);
USART1->DR = (u8) ch;
return ch; }
#endif #if EN_USART2_RX u8 USART_RX_BUF[USART_REC_LEN];
u16 USART_RX_STA=0;
void uart2_init(u32 bound){ GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 ,ENABLE); GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
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;
USART_Init(USART2, &USART_InitStructure); USART_Cmd(USART2, ENABLE); #if EN_USART2_RX
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
#endif }
void uart1_init(u32 bound){ GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
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;
USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE);
}
void USART2_IRQHandler(void) {
u8 Res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
Res =USART_ReceiveData(USART2); USART_RX_BUF[USART_RX_STA&0x1fff]=Res;
USART_RX_STA++;
if(USART_RX_STA>100)
USART_RX_STA|=0x8000; } 下面是主函数 int main(void) {
u8 t; u8 len; u16 times=0; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(168); uart1_init(115200); uart2_init(9600); LED_Init();
while(1) {
USART_ClearFlag(USART2,USART_FLAG_RXNE); USART_ClearFlag(USART2,USART_FLAG_TC); USART_SendData(USART2,0xb2); while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET); USART_SendData(USART2,0x1f); while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET); USART_SendData(USART2,0xff); while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x1fff; for(t=0;t<len;t++) { USART_SendData(USART1,USART_RX_BUF[t]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); } USART_RX_STA=0; }else { times++; if(times%30==0)LED0=!LED0; delay_ms(10); } } }
麻烦各位大神帮我看一下谢谢啦十万火急
|