微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 关于cc2541蓝牙模块串口透传中的数据传送乱码问题

关于cc2541蓝牙模块串口透传中的数据传送乱码问题

时间:10-02 整理:3721RD 点击:

我修改了两个cc2541间串口透传的例程编程,使主从机间能够通信,并且主机通过rx tx 串口接收到其他传感器传过来的数据  但主机通过无线发送给从机数据出现了乱码的问题左边是主机,右边是从机 ,, 不知道在程序上怎么解决了 ,希望  帮忙解决下

 肯定是串口的原因。无线有校验的,不会这么离谱。你的丛机的串口是自己配置的还是使用默认的DMA方式,有没有开启power saving?

我从机的串口没有改  自己改的主机的串口配置 通过主机的rx 收到其他传感器的数据 然后通过主机,无线发送给从机,从机进行无线接收,从机的串口也需要配置吗?从机的串口调试助手不是显示的是无线接收模块的数据吗? 我给你看看 我主机改的部分程序。。。

// configure UART

uartConfig.configured = TRUE;
uartConfig.baudRate =SBP_UART_BR;//波特率
uartConfig.flowControl = SBP_UART_FC;//流控制
uartConfig.flowControlThreshold = SBP_UART_FC_THRESHOLD;//流控制阈值,当开启flowControl时,该设置有效
uartConfig.rx.maxBufSize = SBP_UART_RX_BUF_SIZE;//uart接收缓冲区大小
uartConfig.tx.maxBufSize = SBP_UART_TX_BUF_SIZE;//uart发送缓冲区大小
uartConfig.idleTimeout = SBP_UART_IDLE_TIMEOUT;
uartConfig.intEnable = SBP_UART_INT_ENABLE;//是否开启中断
uartConfig.callBackFunc = sbpSerialAppCallback;//uart接收回调函数,在该函数中读取可用uart数据

// start UART
// Note: Assumes no issue opening UART port.
(void)HalUARTOpen( SBP_UART_PORT, &uartConfig );

return;
}

void UartSendString(int8 *Data, uint16 len)
{
uint16 i;

for(i=0; i<len; i++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}

/****************************************************************************
名 称: UartSendByte()
功 能: 串口发送函数
入口参数: byte,带发送的数据
出口参数: 无
****************************************************************************/
void UartSendByte(int8 byte)
{
U0DBUF = byte;
while(UTX0IF == 0);
UTX0IF = 0;
}
uint16 numBytes;
/*uart接收回调函数*/
void sbpSerialAppCallback(uint8 port, uint8 event)
{
uint8 pktBuffer[SBP_UART_RX_BUF_SIZE];
// unused input parameter; PC-Lint error 715.
(void)event;
int i=0;
for(i=6000;i>0;i--){
asm("nop");
}
//HalLcdWriteString("Data form my UART:", HAL_LCD_LINE_4 );
//返回可读的字节
if ( (numBytes =Hal_UART_RxBufLen(port)) > 0 ){
//读取全部有效的数据,这里可以一个一个读取,以解析特定的命令
(void)HalUARTRead (port, pktBuffer, numBytes);
if(pktBuffer[0]=='A' && pktBuffer[1]=='T'){
CommondHandle(pktBuffer, numBytes);
}else{
P0SEL |= BV(2) | BV(3);//配置P0.2和P0.3为外设,非GPIO
U0CSR |= BV(7); //配置当前为UART,非SPI

UTX0IF = 0;//位寄存器,直接操作,清除中断标志

U0CSR |= BV(6);//允许接收数据
IEN0 |= BV(2);//打开接收中断
EA=1;//打开总中断
numBytes=U0DBUF;
sbpGattWriteString(pktBuffer, numBytes);

}
}

}

帮忙看一下了  谢谢

从你的图片看,主机已经实现自收自发了,应该不是主机的问题。所以问你丛机的预编译有没有添加POWER SAVING,串口默认的是DMA方式,与CPU并行。如果添加了POWER SAVING,CPU为了节电把主晶振关了,串口就会乱码。

 没有添加POWER SAVING 应该不是那的问题     

// configure UART
uartConfig.configured = TRUE;
uartConfig.baudRate = SBP_UART_BR;//波特率
uartConfig.flowControl = SBP_UART_FC;//流控制
uartConfig.flowControlThreshold = SBP_UART_FC_THRESHOLD;//流控制阈值,当开启flowControl时,该设置有效
uartConfig.rx.maxBufSize = SBP_UART_RX_BUF_SIZE;//uart接收缓冲区大小
uartConfig.tx.maxBufSize = SBP_UART_TX_BUF_SIZE;//uart发送缓冲区大小
uartConfig.idleTimeout = SBP_UART_IDLE_TIMEOUT;
uartConfig.intEnable = SBP_UART_INT_ENABLE;//是否开启中断
uartConfig.callBackFunc = sbpSerialAppCallback;//uart接收回调函数,在该函数中读取可用uart数据

// start UART
// Note: Assumes no issue opening UART port.
(void)HalUARTOpen( SBP_UART_PORT, &uartConfig );

return;
}
uint16 numBytes;
/*uart接收回调函数*/
void sbpSerialAppCallback(uint8 port, uint8 event)
{
static unsigned count=0;
uint8 pktBuffer[SBP_UART_RX_BUF_SIZE];
// unused input parameter; PC-Lint error 715.
(void)event;
HalLcdWriteString("Data form my UART:", HAL_LCD_LINE_4 );
HalLcdWriteString("Data form my UART:", HAL_LCD_LINE_4 );
//返回可读的字节
if ( (numBytes = Hal_UART_RxBufLen(port)) > 0 ){
//读取全部有效的数据,这里可以一个一个读取,以解析特定的命令
(void)HalUARTRead (port, pktBuffer, numBytes);
HalLcdWriteString(pktBuffer, HAL_LCD_LINE_5 );
sbpSerialAppSendNoti(pktBuffer,numBytes);
}

}
void sbpSerialAppWrite(uint8 *pBuffer, uint16 length)
{
HalUARTWrite (SBP_UART_PORT, pBuffer, length);
}

void sbpSerialAppSendNoti(uint8 *pBuffer,uint16 length)
{
uint8 len;
if(length > 20)
len = 20;
else
len = length;
static attHandleValueNoti_t pReport;
pReport.handle=0x2E;
pReport.len = len;
osal_memcpy(pReport.value, pBuffer, len);
GATT_Notification( 0, &pReport, FALSE );
}

这是从机接收的代码  麻烦看一下

在你的丛机程序中注释掉这一句试试看:HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_ENABLE_CLK_divIDE_ON_HALT );

还不行的话就单步调试,在串口输出之前打个断点,看看缓冲区的数据跟主机发的是否一致,确定问题在哪个环节。

在从机程序中没有找到你说要注释掉的那句  应该没有 你看一下 从机的程序 帮我看看 问题在哪  还是没有能解决

void serialAppInitTransport( )
{
halUARTCfg_t uartConfig;

// configure UART
uartConfig.configured = TRUE;
uartConfig.baudRate = SBP_UART_BR;//波特率
uartConfig.flowControl = SBP_UART_FC;//流控制
uartConfig.flowControlThreshold = SBP_UART_FC_THRESHOLD;//流控制阈值,当开启flowControl时,该设置有效
uartConfig.rx.maxBufSize = SBP_UART_RX_BUF_SIZE;//uart接收缓冲区大小
uartConfig.tx.maxBufSize = SBP_UART_TX_BUF_SIZE;//uart发送缓冲区大小
uartConfig.idleTimeout = SBP_UART_IDLE_TIMEOUT;
uartConfig.intEnable = SBP_UART_INT_ENABLE;//是否开启中断
uartConfig.callBackFunc = sbpSerialAppCallback;//uart接收回调函数,在该函数中读取可用uart数据

// start UART
// Note: Assumes no issue opening UART port.
(void)HalUARTOpen( SBP_UART_PORT, &uartConfig );

return;
}
uint16 numBytes;
/*uart接收回调函数*/
void sbpSerialAppCallback(uint8 port, uint8 event)
{
static unsigned count=0;
uint8 pktBuffer[SBP_UART_RX_BUF_SIZE];
// unused input parameter; PC-Lint error 715.
(void)event;
HalLcdWriteString("Data form my UART:", HAL_LCD_LINE_4 );
HalLcdWriteString("Data form my UART:", HAL_LCD_LINE_4 );
//返回可读的字节
if ( (numBytes = Hal_UART_RxBufLen(port)) > 0 ){
//读取全部有效的数据,这里可以一个一个读取,以解析特定的命令
(void)HalUARTRead (port, pktBuffer, numBytes);
HalLcdWriteString(pktBuffer, HAL_LCD_LINE_5 );
sbpSerialAppSendNoti(pktBuffer,numBytes);
}

}
void sbpSerialAppWrite(uint8 *pBuffer, uint16 length)
{
HalUARTWrite (SBP_UART_PORT, pBuffer, length);
}

void sbpSerialAppSendNoti(uint8 *pBuffer,uint16 length)
{
uint8 len;
if(length > 20)
len = 20;
else
len = length;
static attHandleValueNoti_t pReport;
pReport.handle=0x2E;
pReport.len = len;
osal_memcpy(pReport.value, pBuffer, len);
GATT_Notification( 0, &pReport, FALSE );
}   谢谢了

是否有把数据缓存下来跟主机发送的数据作对比?先确定数据在哪一步产生了错误。你使用的这个sbp例程我没有用过,个人认为1.40版本自带的npi.c中提供的串口api比较稳定,你可以移植一下。

上一篇:回复Butterfly
下一篇:Observer接收广播

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top