使用串口转I2C实现数据的收发总是出现丢数据的现象

beijidejiaobu 2015-04-10 10:31:53
谁可以帮我看看下面的代码,使用串口转I2C实现数据的收发总是出现丢数据的现象,里面的函数调用基本上是使用库函数,我是使用神舟王STM32F207ZGT的开发板,根据里面的例程65EEPROM读写程序来改写的。
通过串口1中断来读写数据。
static void Delay(volatile uint32_t nCount);
u16 gu16WriteAddr = 0;
u16 gu16ReadAddr = 0;
int main(void)
{
u16 u16I2CSendLen = 0;
u16 u16UartSendLen = 0;
u16 temp = 0;
CPU_Init(); /* Initialize uC/CPU services. */
BSP_Init();

sEE_Init(); /* Initialize the I2C EEPROM driver. */
//I2C test
while(1) //大循环
{
u8 u8I2CSendBuf[BufLen];
u8 u8Uart1SendBuf[BufLen];
u16I2CSendLen = 0;
u16UartSendLen = 0;
u16I2CSendLen = HW_UartReadData(UART_1, BufLen, u8I2CSendBuf); //是我自己写的,
// HW_UartWriteData(UART_1, u16I2CSendLen, u8I2CSendBuf);//是我自己写的,这里我注释掉了,注释前通过串口可以看到数据收发正确。
// Delay(6000000);//这里我加了个延时的函数,数据能收发正确,但是会出现第一次发送不正确,并且多次发送后也有丢数据的现象发生。无语了
if (u16I2CSendLen > 0)
{
sEE_WriteBuffer(u8I2CSendBuf, gu16WriteAddr + u16I2CSendLen, u16I2CSendLen);
u16UartSendLen = u16I2CSendLen;
sEE_ReadBuffer(u8Uart1SendBuf, gu16ReadAddr + u16I2CSendLen, (uint16_t *)(&u16UartSendLen));
HW_UartWriteData(UART_1, u16I2CSendLen, u8Uart1SendBuf);
}
}
//end test
}
/*
*********************************************************************************************************
* 中断处理函数
*********************************************************************************************************
*/
void USART1_IRQHandler()
{
HW_UartISP(UART_1);
}
void USART3_IRQHandler()
{
HW_UartISP(UART_2);
}
static void Delay(volatile uint32_t nCount)
{
for (; nCount != 0; nCount--)
{
}
}
input:
123456789
output:
11356789
input:
aacxyz
output:
abcdxyz
...全文
366 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
子善旬 2015-04-10
  • 打赏
  • 举报
回复
1、 要保证 UART发送前的数据的准确。即gu16ReadAddr + u16I2CSendLen 和 gu16WriteAddr + u16I2CSendLen 不溢出等。 2. HW_UartWriteData 什么方式写,没有code,说不出啥。 3. u8Uart1SendBuf 的内容要对。 4. 你说的太模糊了,不知道你的实际情景,input 指从哪儿input,output从哪儿output,。。。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧