Linux下收发AT指令的方法

一、echo和 cat
echo和cat是Linux和Android系统下和模块收发AT的一种简单方法。
注意这个方法如果商用存在风险
(1) 如果没有发ATEO关闭回显,可能导致通道无法使用
(2) 在个别设备里发给模组的“AT+CPIN?”命令会变成"AT+CAT+CPIN? ”引起错误,所以这个方法不推荐商用,仅用于调试
(3) 如果端口无法使用尝试重启模组


二、c程序
实际商用的情况下推荐用“.c”的方式实现
右边是一个简单的串口程序源码,用法如下在Linux下创建一个t.c文件,并且将下方的源码保存。在t.c 所在路径下执行 gcc -o t t.c 指令生成可执行文件“t”后 运行可执行文件 ./t
根据提示输入需要发送AT指令的端口,如: /dev/ttyUSBO此时弹出系统提示打开端口成功,可输入AT指令,若需要退出可按住 Ctrl+z 即可退出
也可以使用其他工具

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
//#define ATPORT "/dev/ttyUSB0"
#define BUFSIZE 1000
#define BAUDRATE B115200
char ATPORT[1024];
int open_port(char *port)
{
struct termios options;
int fd;
fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
printf("%s: Unable to open the port - \r\n",__func__);
} else {
fcntl(fd, F_SETFL, FNDELAY);
tcgetattr( fd, &options );
cfsetispeed( &options, BAUDRATE );
cfsetospeed( &options, BAUDRATE );
options.c_cflag |= ( CLOCAL | CREAD);
options.c_cflag &= ~(CSIZE | PARENB | CSTOPB | CSIZE);
options.c_cflag |= CS8;
options.c_cflag &= ~CRTSCTS;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_iflag &= ~(IXON | IXOFF | IXANY | ICRNL | INLCR | IGNCR);
options.c_oflag &= ~OPOST;
if ( tcsetattr( fd, TCSANOW, &options ) == -1 ) {
printf ("Error with tcsetattr = %s\r\n", strerror ( errno ) );
} else {printf ( "Open port %s succeed\r\n",ATPORT);
}}return (fd);}
int send(int fd,char *str){ printf("AT send :%s\r\n",str); write(fd,str,strlen(str)); write(fd,"\r\n",2);
return 0;}
int receive(int fd){
char buf[BUFSIZE] = {0}; read(fd,buf, BUFSIZE); printf("AT receive: %s\r\n", buf);
return 0;}
int main(){ system("ls /dev/ttyUSB*"); system("ls /sys/class/net");
printf("Please input port as /dev/ttyUSB0:\r\n");
scanf("%s",ATPORT);
char buf[1024];
int fd = open_port(ATPORT);
while(1){
printf("Please input command:\r\n");
scanf("%s",buf);
send(fd,buf);
sleep(1);
receive(fd);
}
close(fd);
return 0;
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用STM32收发AT指令的简单示例程序,以使用USART1为例: ```c #include "stm32f1xx_hal.h" #define RX_BUFFER_SIZE 1024 #define TX_BUFFER_SIZE 1024 UART_HandleTypeDef huart1; uint8_t rx_buffer[RX_BUFFER_SIZE]; uint16_t rx_idx = 0; uint8_t tx_buffer[TX_BUFFER_SIZE]; uint16_t tx_idx = 0; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart == &huart1) { if (rx_idx < RX_BUFFER_SIZE) { rx_buffer[rx_idx++] = huart->Instance->DR; } HAL_UART_Receive_IT(&huart1, &huart1->Instance->DR, 1); } } void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if (huart == &huart1) { if (tx_idx > 0) { uint16_t size = tx_idx > TX_BUFFER_SIZE ? TX_BUFFER_SIZE : tx_idx; HAL_UART_Transmit_IT(&huart1, tx_buffer, size); tx_idx -= size; for (int i = 0; i < tx_idx; i++) { tx_buffer[i] = tx_buffer[i + size]; } } } } void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { if (huart == &huart1) { HAL_UART_Receive_IT(&huart1, &huart1->Instance->DR, 1); } } void send_at_command(const char *command) { uint16_t len = strlen(command); if (len <= TX_BUFFER_SIZE - tx_idx) { memcpy(tx_buffer + tx_idx, command, len); tx_idx += len; HAL_UART_Transmit_IT(&huart1, tx_buffer, len); } } int main(void) { HAL_Init(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_USART1_CLK_ENABLE(); GPIO_InitTypeDef gpio_init = { .Pin = GPIO_PIN_9 | GPIO_PIN_10, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = GPIO_AF7_USART1, }; HAL_GPIO_Init(GPIOA, &gpio_init); huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart1); HAL_UART_Receive_IT(&huart1, &huart1->Instance->DR, 1); //开启接收中断 while (1) { // 发送 AT 指令 send_at_command("AT\r\n"); HAL_Delay(500); // 接收 AT 指令的回复 if (rx_idx > 0) { rx_buffer[rx_idx] = '\0'; printf("Recv: %s", rx_buffer); rx_idx = 0; } } } ``` 注意事项: 1. 在使用HAL库时,需要在stm32f1xx_hal_conf.h文件中开启UART中断接收和发送的宏定义: ```c #define HAL_UART_MODULE_ENABLED #define HAL_UART_RX_IT_ENABLE #define HAL_UART_TX_IT_ENABLE ``` 2. 在发送和接收AT指令时,需要使用\r\n结尾。 3. 在接收数据时,需要在HAL_UART_RxCpltCallback回调函数中开启下一次接收。 4. 在发送数据时,需要在HAL_UART_TxCpltCallback回调函数中继续发送缓冲区中剩余的数据。 5. 在出现串口接收错误时,需要在HAL_UART_ErrorCallback回调函数中重新开启接收。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值