乐鑫技术交流
直播中

陈艳

7年用户 986经验值
私信 关注
[问答]

使用激光测距传感器和esp32进行can通信,为什么esp32只能接收到6组数据?

目前,我使用激光测距传感器和esp32进行can通信,esp32发送一条读指令给传感器,传感器返回16组距离数值,128个字节。can卡能接收到所有的16组数据,但是esp32只能接收到6组数据,这6组数据有时还不连续。我想这是不是接收缓冲区是不是太小了,所以导致只能接收6组数据,希望大神给分析分析。

void receTask(void *arge)
{
    uint8_t id = 0;
    twai_message_t receMess;
    while (true)
    {
        ESP_LOGI(TAG, "Rece task");
        xSemaphoreTake(rx_sem, portMAX_DELAY); // wait rx_sem
        ESP_LOGI(TAG, "IN RECE");

        for (int i = 0; i < 16; i++)
        {
            if (twai_receive(&receMess, pdMS_TO_tiCKS(50)) == ESP_OK)
            {
                if (model_number)
                {
                    id = (uint8_t)(receMess.identifier & 0xFF); // 获取此帧数据ID,ID 为0x200+id,大于16位,所以与0xFF则得到是第几个设备,设备号连续。
                    ESP_LOGI(TAG, "Index : %d", receMess.data[6]);
                    Tof_m[id].ID = id;
                    Tofm_can_Unpack_Data(id, &receMess, totalDist);
                }
            }
        }
        xSemaphoreGive(tx_sem);
                                                                                                                                                                                                                        
               
               
                                                                                                                                                                                                               
               
               

回帖(2)

李高歌

2024-6-12 14:36:52
TWAI 所有收到的包都会写进去一个 RX Queue 里, 而且所有发出的包都会先写进一个 TX Queue。RX Queue 和 TX Queue 的大小都可以通过 twai_general_config_t 的 tx_queue_len 和 rx_queue_len 配的。
                                                                                                 
举报

百灵千岛酱

2024-6-12 17:34:51
根据您提供的信息,我将分析可能导致ESP32只能接收到6组数据的原因,并提供一些建议。

1. 接收缓冲区大小:您提到的接收缓冲区可能太小,这确实是一个可能的原因。请检查您的ESP32接收缓冲区大小是否足够容纳128个字节的数据。如果不够,请增加缓冲区大小。

2. 数据接收中断处理:请确保您的ESP32在接收到CAN数据时,正确地处理了中断。如果中断处理不当,可能会导致数据丢失或接收不完整。

3. 数据接收超时:请检查您的ESP32在接收数据时是否有超时设置。如果有,请确保超时时间足够长,以便接收完整的16组数据。

4. 数据包丢失:在CAN通信中,数据包可能会因为网络拥塞或其他原因丢失。请检查您的CAN网络是否稳定,以及是否有数据包丢失的情况。

5. 传感器发送数据问题:请确保激光测距传感器发送的数据是正确的,并且没有发送错误或不完整的数据。

为了解决这个问题,您可以尝试以下步骤:

1. 检查并增加接收缓冲区大小,确保可以容纳128个字节的数据。

2. 检查ESP32的CAN中断处理代码,确保在接收到数据时正确处理。

3. 如果有超时设置,请调整超时时间,确保足够长以接收完整的数据。

4. 检查CAN网络的稳定性,确保没有数据包丢失。

5. 检查激光测距传感器的数据发送逻辑,确保发送的数据是正确的。

6. 在接收数据的过程中,添加一些调试信息,以便更好地了解数据接收过程中可能出现的问题。

希望这些建议能帮助您解决问题。如果问题仍然存在,请提供更多的代码和信息,以便进一步分析。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分