铱星9602:9线制改3线制
- 执行AT&D0,进行忽略DTR引脚,返回OK
- 执行AT&K0,进行禁用流控制,改成三线模式,返回OK
- 执行AT&W0,进行保存,返回OK.
代码
#include <rtthread.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include "board.h"
#include "string.h"
#define KEY0 GET_PIN(H, 9) //电源控制引脚
rt_device_t uart2_dev;
struct rt_semaphore sem;
rt_thread_t uart2_th;
typedef enum{
FRAME_STEP_START = 0, /*判断表头*/
FRAME_DATA, /*循环接收数据*/
}frame_step;
struct serial_configure uart2_configs =
{
19200, /* 115200 bits/s */
DATA_BITS_8, /* 8 databits */
STOP_BITS_1, /* 1 stopbit */
PARITY_NONE, /* No parity */
BIT_ORDER_LSB, /* LSB first sent */
NRZ_NORMAL, /* Normal mode */
RT_SERIAL_RB_BUFSZ, /* Buffer size */
0
};
rt_err_t rx_callback(rt_device_t dev, rt_size_t size)
{
rt_sem_release(&sem);
return RT_EOK;
}
void serial_thread_entry(void *parameter)
{
char sensor_data = 0;
frame_step frame = FRAME_STEP_START;
char buffer[16];
uint8_t offset = 0;
while (1)
{
/* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */
while (rt_device_read(uart2_dev, -1, &sensor_data, 1) != 1)
{
/* 阻塞等待接收信号量,等到信号量后再次读取数据 */
rt_sem_take(&sem, RT_WAITING_FOREVER);
}
switch (frame){
case FRAME_STEP_START:{
offset = 0;
if((sensor_data == 0x4F)||(sensor_data == 0x2B)||(sensor_data == 0x45)){
buffer[offset++] = sensor_data;
frame =FRAME_DATA;
}
break;
}
case FRAME_DATA:{
buffer[offset++] = sensor_data;
if(sensor_data == 0x0a)
{
rt_kprintf("%s\n", buffer);
frame = FRAME_STEP_START;
rt_memset(buffer, 0, 6);//给数组清零
}
break;
}
}
}
}
/*增加写数据命令*/
void rt_write(int argc, char *argv[])
{
rt_size_t rev;
char *buffer = argv[1];
if(strcmp(buffer, "AT") == 0)
{
rev = rt_device_write(uart2_dev, 0, "AT\r\n", rt_strlen("AT\r\n"));
}
if(strcmp(buffer, "AT+CSQ") == 0)
{
rev = rt_device_write(uart2_dev, 0, "AT+CSQ\r\n", rt_strlen("AT+CSQ\r\n"));
}
if(strcmp(buffer, "AT+SBDWT") == 0)
{
rev = rt_device_write(uart2_dev, 0, "AT+SBDWT\r\n", rt_strlen("AT+SBDWT\r\n"));
}
//rev = rt_device_write(uart2_dev, 0, (char *)argv[1], rt_strlen(argv[1]));
if (rev == RT_NULL)
{
rt_kprintf("write data failed!size is %d\n", rev);
return;
}
//rt_kprintf("%s", argv[1]);
}
MSH_CMD_EXPORT(rt_write, rt_write);
int main(void)
{
rt_size_t rev;
char *str = "AT\r\n";
/*拉高电源*/
rt_pin_mode(KEY0,PIN_MODE_OUTPUT);
rt_pin_write(KEY0, PIN_HIGH);
uart2_dev = rt_device_find("uart2");
if (uart2_dev == RT_NULL)
{
rt_kprintf("Can't find device\n");
return 0;
}
if (rt_device_open(uart2_dev, RT_DEVICE_FLAG_RDWR|RT_DEVICE_FLAG_INT_RX) != RT_EOK)
{
rt_kprintf("open device failed!\n");
return 0;
}
rt_device_control(uart2_dev, RT_DEVICE_CTRL_CONFIG, &uart2_configs);
/*给铱星模块写入测试命令*/
rev = rt_device_write(uart2_dev, 0, str, rt_strlen(str));
//rt_kprintf("%s", str);
if (rev == RT_NULL)
{
rt_kprintf("write data failed!size is %d\n", rev);
rt_device_close(uart2_dev);
return 0;
}
rt_kprintf("write data success! %d\n", rev);
/*创建线程,接收数据*/
uart2_th = rt_thread_create("uart2_dev", serial_thread_entry, "uart2", 2048, 10, 5);
rt_thread_startup(uart2_th);
/*初始化信号量*/
rt_sem_init(&sem, "rt_sem", 0, RT_IPC_FLAG_FIFO);
/*数据接收回调函数*/
rt_device_set_rx_indicate(uart2_dev, rx_callback);
return RT_EOK;
}
注:读完一组数之后一定要给数组清零,否则下一次打印会出现错误
与9602连接时,注意收发引脚