我正在尝试将PAHO嵌入式C库实现到自定义设备(STM32F405 / GPRS模块)
我的主要问题是创建自定义recv()函数,它将使用source作为缓冲区。
在PAHO库示例中,有一个transport_getdata()函数。它处理运输层。 这是tranport_getdata()函数。这个例子使用我没有的套接字库:(
int transport_getdata(unsigned char* buf, int count)
{
int rc = recv(mysock, buf, count, 0);
//printf("received %d bytes count %d\n", rc, (int)count);
return rc;
}
要将库移植到我的项目,我需要编写自己的recv()函数,如my_recv()。
标准套接字Recv()函数描述说,
Recv()将返回从源写入缓冲区的消息长度。
所以我尝试编写my_recv()来替换recv(),(我不需要套接字ID和FLAG)
int my_recv(char *buf, int len){
int i=0;
if (len <= 0 )
return -1;
if (len > BUF_MAX)
len=BUF_MAX - 2;
for(i=0;i<len;i++){
*buf=serial_buffer[0];
*buf++;
//shift one byte buffer to left
memmove(serial_buffer, serial_buffer+1,(BUF_MAX-1)*sizeof(*serial_buffer));
interrupt_pointer--; // After one byte shift, reduce serial interrupt pointer.
}
return i;
}
处理TCP传入数据,我通过GPRS模块进行串行/ TCP透明连接 我使用中断来读取串行中的每个字节以及在serial_buffer上写入的所有传入字节。
void USART1_IRQHandler(void){
int byte;
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // Received characters modify string
{
byte= USART_ReceiveData(USART1);
}
serial_buffer[interrupt_pointer]=byte;
interrupt_pointer++;
if(interrupt_pointer==BUF_MAX){
interrupt_pointer=0;
memset(serial_buffer,0,BUF_MAX);
}
}
对于简单测试,我从TCP套接字发送“1234567890”,
简单的测试代码是
while(strlen(serial_buffer)>0){
delay_ms(1000);
printf("%s\r\n",serial_buffer);
my_recv(buf,3);
printf("%s\r\n",buf);
printf("%s\r\n",serial_buffer);
}
我的系统是,
1234567890 // All TCP data received
123 // getting 3 bytes from buffer
4567890 // remaining bytes
我不确定我是否理解recv()函数。 输出没问题。
Couse仍然无法使用PAHO库处理MQTT包。
答案 0 :(得分:1)
我不熟悉MQTT,但我建议你为你的缓冲区使用volatile类型。这样,编译器就不会将其优化为标准变量。
volatile unsigned char serial_buffer[512];
您的交通运输功能如何?