fix e220 lora send and receive bug using ch438 uart in xidatong board

This commit is contained in:
Liu_Weichao
2022-04-25 10:52:05 +08:00
parent 99b5c0d9a0
commit e5296efa91
5 changed files with 91 additions and 31 deletions
@@ -117,6 +117,12 @@ enum IpType
IPV6,
};
struct AdapterData
{
uint32 len;
uint8 *buffer;
};
struct AdapterProductInfo
{
uint32_t functions;
@@ -29,8 +29,8 @@ extern AdapterProductInfoType E220Attach(struct Adapter *adapter);
#endif
#define ADAPTER_LORA_CLIENT_NUM 255
#define ADAPTER_LORA_DATA_LENGTH 128
#define ADAPTER_LORA_RECV_DATA_LENGTH 256
#define ADAPTER_LORA_DATA_LENGTH 256
#define ADAPTER_LORA_RECV_DATA_LENGTH ADAPTER_LORA_DATA_LENGTH + 16
#define ADAPTER_LORA_DATA_HEAD 0x3C
#define ADAPTER_LORA_NET_PANID 0x0102
@@ -167,13 +167,7 @@ static int LoraReceiveDataCheck(uint8 *data, uint16 length, struct LoraDataForma
uint32 recv_data_length = 0;
for ( i = 0; i < length; i ++) {
if (ADAPTER_LORA_DATA_HEAD == data[i]) {
#ifdef ADD_NUTTX_FETURES
/*Big-Endian*/
recv_data_length = (data[i + 4] & 0xFF) | ((data[i + 5] & 0xFF) << 8) | ((data[i + 6] & 0xFF) << 16) | ((data[i + 7] & 0xFF) << 24);
#else
/*Little-Endian*/
recv_data_length = ((data[i + 4] & 0xFF) << 24) | ((data[i + 5] & 0xFF) << 16) | ((data[i + 6] & 0xFF) << 8) | (data[i + 7] & 0xFF);
#endif
if (sizeof(struct LoraDataFormat) == recv_data_length) {
memcpy(recv_data, (uint8 *)(data + i), sizeof(struct LoraDataFormat));
return 0;
@@ -469,6 +463,7 @@ static int LoraClientDataAnalyze(struct Adapter *adapter, void *send_buf, int le
static int LoraClientJoinNet(struct Adapter *adapter, unsigned short panid)
{
struct LoraDataFormat client_join_data;
struct AdapterData priv_lora_net;
memset(&client_join_data, 0, sizeof(struct LoraDataFormat));
@@ -484,7 +479,10 @@ static int LoraClientJoinNet(struct Adapter *adapter, unsigned short panid)
client_join_data.flame_head, client_join_data.length, client_join_data.panid, client_join_data.data_type,
client_join_data.client_id, client_join_data.gateway_id, client_join_data.crc16);
if (AdapterDeviceJoin(adapter, (uint8 *)&client_join_data) < 0) {
priv_lora_net.len = sizeof(struct LoraDataFormat);
priv_lora_net.buffer = (uint8 *)&client_join_data;
if (AdapterDeviceJoin(adapter, (uint8 *)&priv_lora_net) < 0) {
return -1;
}
@@ -498,18 +496,22 @@ static int LoraClientJoinNet(struct Adapter *adapter, unsigned short panid)
*/
static int LoraClientQuitNet(struct Adapter *adapter, unsigned short panid)
{
struct LoraDataFormat client_join_data;
struct LoraDataFormat client_quit_data;
struct AdapterData priv_lora_net;
memset(&client_join_data, 0, sizeof(struct LoraDataFormat));
memset(&client_quit_data, 0, sizeof(struct LoraDataFormat));
client_join_data.flame_head = ADAPTER_LORA_DATA_HEAD;
client_join_data.length = sizeof(struct LoraDataFormat);
client_join_data.panid = panid;
client_join_data.data_type = ADAPTER_LORA_DATA_TYPE_QUIT;
client_join_data.client_id = adapter->net_role_id;
client_join_data.crc16 = LoraCrc16((uint8 *)&client_join_data, sizeof(struct LoraDataFormat) - 2);
client_quit_data.flame_head = ADAPTER_LORA_DATA_HEAD;
client_quit_data.length = sizeof(struct LoraDataFormat);
client_quit_data.panid = panid;
client_quit_data.data_type = ADAPTER_LORA_DATA_TYPE_QUIT;
client_quit_data.client_id = adapter->net_role_id;
client_quit_data.crc16 = LoraCrc16((uint8 *)&client_quit_data, sizeof(struct LoraDataFormat) - 2);
if (AdapterDeviceDisconnect(adapter, (uint8 *)&client_join_data) < 0) {
priv_lora_net.len = sizeof(struct LoraDataFormat);
priv_lora_net.buffer = (uint8 *)&client_quit_data;
if (AdapterDeviceDisconnect(adapter, (uint8 *)&priv_lora_net) < 0) {
return -1;
}
@@ -623,7 +625,6 @@ static void *LoraGatewayTask(void *parameter)
static void *LoraClientDataTask(void *parameter)
{
int i, ret = 0;
int join_times = 10;
struct Adapter *lora_adapter = (struct Adapter *)parameter;
struct LoraClientParam *client = (struct LoraClientParam *)lora_adapter->adapter_param;
@@ -344,10 +344,9 @@ static int E220Ioctl(struct Adapter *adapter, int cmd, void *args)
static int E220Join(struct Adapter *adapter, unsigned char *priv_net_group)
{
int ret;
struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group;
uint16 len = 144;
ret = PrivWrite(adapter->fd, (void *)priv_net_group, len);
ret = PrivWrite(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len);
if(ret < 0) {
printf("E220 Join net group failed: %d!\n", ret);
}
@@ -383,7 +382,22 @@ static int E220Send(struct Adapter *adapter, const void *buf, size_t len)
*/
static int E220Recv(struct Adapter *adapter, void *buf, size_t len)
{
return PrivRead(adapter->fd, buf, len);
int recv_len, recv_len_continue;
uint8 *recv_buf = PrivMalloc(len);
recv_len = PrivRead(adapter->fd, recv_buf, len);
while (recv_len < len) {
recv_len_continue = PrivRead(adapter->fd, recv_buf + recv_len, len - recv_len);
recv_len += recv_len_continue;
}
memcpy(buf, recv_buf, recv_len);
PrivFree(recv_buf);
return recv_len;
}
/**
@@ -396,9 +410,9 @@ static int E220Quit(struct Adapter *adapter, unsigned char *priv_net_group)
{
int ret;
uint16 len = 144;
struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group;
ret = PrivWrite(adapter->fd, (void *)priv_net_group, len);
ret = PrivWrite(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len);
if(ret < 0){
printf("E220 quit net group failed %d!\n", ret);
}
@@ -108,7 +108,9 @@ static int Sx1278Ioctl(struct Adapter *adapter, int cmd, void *args)
static int Sx1278Join(struct Adapter *adapter, unsigned char *priv_net_group)
{
int ret;
ret = Sx127x_Nuttx_Write(adapter->fd, (void *)priv_net_group, 144);
struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group;
ret = Sx127x_Nuttx_Write(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len);
if(ret < 0){
printf("Sx1278 Join net group failed: %d!\n", ret);
}
@@ -119,7 +121,9 @@ static int Sx1278Join(struct Adapter *adapter, unsigned char *priv_net_group)
static int Sx1278Join(struct Adapter *adapter, unsigned char *priv_net_group)
{
int ret;
ret = PrivWrite(adapter->fd, (void *)priv_net_group, 144);
struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group;
ret = PrivWrite(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len);
if(ret < 0){
printf("Sx1278 Join net group failed: %d!\n", ret);
}
@@ -196,7 +200,9 @@ static int Sx1278Recv(struct Adapter *adapter, void *buf, size_t len)
static int Sx1278Quit(struct Adapter *adapter, unsigned char *priv_net_group)
{
int ret;
ret = Sx127x_Nuttx_Write(adapter->fd, (void *)priv_net_group, 144);
struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group;
ret = Sx127x_Nuttx_Write(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len);
if(ret < 0){
printf("Sx1278 quit net group failed %d!\n", ret);
}
@@ -207,7 +213,9 @@ static int Sx1278Quit(struct Adapter *adapter, unsigned char *priv_net_group)
static int Sx1278Quit(struct Adapter *adapter, unsigned char *priv_net_group)
{
int ret;
ret = PrivWrite(adapter->fd, (void *)priv_net_group, 144);
struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group;
ret = PrivWrite(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len);
if(ret < 0){
printf("Sx1278 quit net group failed %d!\n", ret);
}