QS100芯片,使用步骤

CommonStatus Inf_QS100_SendData(uint8_t *data, uint16_t len)
{
    CommonStatus st;
    uint8_t count = TCP_RETRY_COUNT;
    // 物联网卡连上网:附着,没有连上网:去附着--------------------------
    // 判断是否连接到外网
    do
    {
        st = Inf_QS100_Get_IP();
    } while (st == COMMON_ERROR && count--);

    // 重试次数耗尽
    if (count == 0)
    {
        debug_printfln("连接外网失败!");
        return COMMON_ERROR;
    }

    // 初始化Socket 创建客户端-----------------------------------------------
    count = TCP_RETRY_COUNT;
    uint8_t socket_id = 0xff; // 不要写成0,否则不知道是否成功socket_id的取值只有0和1
    do
    {
        st = Inf_QS100_CreateClient(CLIENT_PORT, &socket_id);

    } while (st == COMMON_ERROR && count--);

    // 重试次数耗尽
    if (count == 0)
    {
        debug_printfln("创建客户端失败!");
        return COMMON_ERROR;
    }

    // 连接远程服务端-------------------------------------------------------------
    // 为防止网络不通畅导致连接失败,这里就建立重复连接机制
    do
    {
        st = Inf_QS100_ConnectServer(socket_id, TCP_SERVER_IP, TCP_SERVER_PORT);

    } while (st == COMMON_ERROR && count--);

    // 重试次数耗尽
    if (count == 0)
    {
        debug_printfln("连接远程服务端失败!");
        return COMMON_ERROR;
    }

    // 发送数据到远程服务端----------------------------------------------------------
    do
    {
        st == Inf_QS100_SendDataToServer(socket_id, data, len, SEQUENCE);

    } while (st == COMMON_ERROR && count--);

    // 重试次数耗尽
    if (count == 0)
    {
        debug_printfln("发送数据到远程服务端失败!");
        return COMMON_ERROR;
    }

    // 关闭客户端------------------------------------------------------------------
    do
    {
        st == Inf_QS100_CloseClient(socket_id);

    } while (st == COMMON_ERROR && count--);

    // 重试次数耗尽
    if (count == 0)
    {
        debug_printfln("关闭客户端失败!");
        return COMMON_ERROR;
    }
    return COMMON_OK;
}

注意:在QS100上创建客户端时,就生成了socket_id,用于和云端服务器做交互

在写代码中可能遇到的bug:

(1)发送数据过长,发送命令缓冲区Cmd接收不下

   uint8_t data_hex[len * 2 + 1]; // 在这里直接赋值会报错
    memset(data_hex, 0, sizeof(data_hex));

    for (uint16_t i = 0; i < len; i++)
    {
        sprintf((char *)&data_hex[i * 2], "%02x", data[i]);
    }
    //因为要发送大量数据所以要设置的大一点
    uint8_t cmd[1024] = {0};
    // 拼接命令
    sprintf((char *)cmd, "AT+NSOSD=%d,%d,%s,0x200,%d\r\n", socket_id, len, data_hex, sequence);

(2)栈空间过小,在运行中导致栈溢出-------》在启动的汇编文件中将栈区空间调大

(3) 超时时间过短

    // 发送AT指令    一秒钟SQ100能接收1200字节,超时时间,要尽量大一点否则或导致数据发送不完整
    HAL_UART_Transmit(&huart3, cmd, strlen((char *)cmd), HAL_MAX_DELAY);

(4)cmd生命周期可能比串口发送的时间短(串口是异步的),导致串口还没有把数据还没发送完,数据就没了(8001---输入的AT命令参数不合法)------------------------》将cmd的生命周期+static

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值