【问题标题】:PAHO Embedded C library Socket Recive implemantationPAHO 嵌入式 C 库 Socket 接收实现
【发布时间】:2015-02-23 05:45:40
【问题描述】:

我正在尝试将 PAHO 嵌入式 C 库实现到自定义设备(STM32F405/GPRS 模块)

我的主要问题是创建自定义 recv() 函数,它将使用源作为缓冲区。

在 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() 函数。 这个输出没问题。

因为我仍然无法使用 PAHO 库处理 MQTT 包。

【问题讨论】:

  • 您的my_recv 函数似乎不会阻止或验证是否有要读取的传入数据,也不会验证您的serial_buffer 中有多少可用数据。您必须以某种方式让它等到serial_buffer 中确实有一些数据可用,并且只读取那里存在的数据。

标签: c sockets serialization mqtt paho


【解决方案1】:

我不熟悉 MQTT,但我建议您将 volatile 类型用于缓冲区。这样,编译器不会将其优化为标准变量。

volatile unsigned char serial_buffer[512];

你的运输功能如何?

【讨论】:

  • 我尝试使用 volatile 缓冲区,但它是一样的。我认为,从缓冲区读取字节后,我必须将其向左滚动。因为当我复制接收字节时,我的缓冲区仍然有接收字节,下次我读取相同的字节时
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2016-02-17
  • 2011-05-30
  • 1970-01-01
相关资源
最近更新 更多