开发环境:win10+官方提供VirtualBox和OVA镜像
编辑工具:source insight3.5
芯片:ESP8285,内置1M FLASH 没有外接FLASH
通过串口做透传,流程是在user_main()函数初始化为STA+AP模式,新建任务,在任务中实现透传,
透传流程,通过串口一个字节一个字节的读出数据,通过一个缓存接受数据并通过socket用TCP传递给路由。
void vTask_station( void * pvParameters )
{
//sockt config
LOCAL int32 sock_fd;
struct sockaddr_in server_addr;
int nNetTimeout = 1000;
int fromlen;
int ret;
uint8 fifo_len;
char TC_data[256] = {0};
uint8 fifo_i = 0;
uint8 data_i = 0;
//ap confi
while(wifi_station_get_connect_status() != STATION_GOT_IP)
{
vTaskDelay(2);
}
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if(sock_fd < 0)
{
printf("ESP8266 TCP task socket > failed to create sock!\n");
vTaskDelay(1000/portTICK_RATE_MS);
while(1);
}
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(5188);
servaddr.sin_addr.s_addr =inet_addr("172.26.36.1");
servaddr.sin_len = sizeof(server_addr);
do{
ret = connect(sock_fd, (struct sockaddr *)&servaddr, sizeof(servaddr));
printf("connect ret = %d\n",ret);
}while(ret < 0);
while(1)
{
//读取串口管道长度
fifo_len = (READ_PERI_REG(UART_STATUS(UART0)) >> UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT;
//如果管道中有数据将数据缓存到缓存器中
if(fifo_len > 0)
{
for(fifo_i = 0; fifo_i < fifo_len; fifo_i++)
{
TC_data[data_i] = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;
data_i++;
}
continue;
}
//读取完成后将数据write到服务器
if(fifo_len == 0 && data_i >0)
{
write(sock_fd, TC_data, strlen(TC_data));
memset(TC_data,0,sizeof(TC_data));
data_i = 0;
}
}
}
第一次用的是串口终端传输,中断传输的话最多接受127个字节。任务情况下可以任意多个字节。可能有更好的API实现方式,希望大家多多指教。版权声明:本文为shinhwalin原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。