关于新手学习Ubuntu使用vim,如何使用c/cpp的编译器以及如何使用makefile的详细记录

ubuntu下

首先如何编辑

1.启动vim编辑器

打开终端,输入vim,按回车键。
vim gcc.c

2.进入编辑模式

输入i ,进入插入模式。就可以修改文件内容了。
按“ESC”退出编辑模式。
在这里插入图片描述

3.退出

Shift键 + “:”,切换到命令模式。

输入“q”后回车,即退出。(当文件未被修改或者修改已经被保存的情况)
输入“wq”后回车,先保存后退出。

如何使用gcc编译(编译的是c)

是一个强大的工具集合,包含预处理器、编译器、汇编器、链接器等组件
由输入文件类型和传递的参数决定gcc具体调用的组件
为开发者提供足够多的参数,可让开发者全面控制代码的生成
gcc下的C程序编译过程
预处理
编译成汇编代码
汇编成目标代码
链接
在这里插入图片描述
参数-o:指定目标名称(缺省gcc编译出来的文件是a.out)

如何使用cpp的编译器

预处理器,gun c编译器在编译前自动使用cpp对程序进行预处理
这是cpp里的内容
在这里插入图片描述
在这里插入图片描述
使用cpp编译器权限不够
改用g++编译器
基本符合ISO标准的C++编译器
在这里插入图片描述

使用 GUN make管理项目

在这里插入图片描述
举例:
在这里插入图片描述
在这里插入图片描述!!]

### 串口通信基础 在 Linux 系统下,串口通常被映射为设备文件 `/dev/ttyS*` 或 `/dev/ttyUSB*`。对于虚拟串口或其他硬件接口(如 USB 转串口),可能还会出现其他类似的设备名称,例如 `/dev/ttyACM0`[^2]。 为了实现 C++ 的串口通信功能,开发者可以通过 POSIX 提供的标准 API 进行操作。这些函数包括 `open()`、`close()`、`read()` 和 `write()`,以及用于设置波特率和其他参数的 `termios` 结构体。 --- ### 配置与初始化过程 #### 打开串口 使用 `open()` 函数打开指定的串口号。如果需要非阻塞模式,则可以在标志位中加入 `O_NONBLOCK` 参数[^1]。 ```cpp #include <fcntl.h> #include <unistd.h> int fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY); // 替换为实际使用的串口路径 if (fd < 0) { perror("Error opening serial port"); } ``` #### 配置串口属性 通过 `tcgetattr()` 获取当前串口的配置,并将其存储在一个 `struct termios` 变量中。随后修改该结构中的字段来调整波特率、数据位数、停止位以及其他选项。 ```cpp #include <termios.h> struct termios options; tcgetattr(fd, &options); // 设置波特率为9600bps cfsetispeed(&options, B9600); cfsetospeed(&options, B9600); // 数据位8位,无校验,一位停止位 options.c_cflag &= ~PARENB; // 清除校验位 options.c_cflag &= ~CSTOPB; // 停止位设为1 options.c_cflag &= ~CSIZE; // 掩码字符大小 options.c_cflag |= CS8; // 设定数据位为8位 // 启用接收器并禁用软件流控制 options.c_cflag |= (CLOCAL | CREAD); // 应用新的配置 tcsetattr(fd, TCSANOW, &options); ``` #### 发送和接收数据 利用标准 I/O 函数读已配置好的串口句柄: ```cpp const char *message = "Hello Serial!"; ssize_t bytes_written = write(fd, message, strlen(message)); if (bytes_written != static_cast<ssize_t>(strlen(message))) { perror("Failed to send data over serial port"); } char buffer[256]; memset(buffer, '\0', sizeof(buffer)); ssize_t bytes_read = read(fd, buffer, sizeof(buffer)-1); if (bytes_read > 0) { printf("Received: %s\n", buffer); } else if (bytes_read == -1){ perror("Read error on serial port"); } ``` 最后关闭串口资源以释放占用: ```cpp close(fd); ``` --- ### 完整示例代码 以下是综合上述各部分的一个完整程序实例: ```cpp #include <iostream> #include <string.h> #include <termios.h> #include <unistd.h> #include <fcntl.h> void configureSerialPort(int fd) { struct termios options; tcgetattr(fd, &options); cfsetispeed(&options, B9600); cfsetospeed(&options, B9600); options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; options.c_cflag |= (CLOCAL | CREAD); tcflush(fd, TCIFLUSH); tcsetattr(fd, TCSANOW, &options); } int main() { int fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY); if (fd < 0) { std::cerr << "Unable to open the specified serial device." << std::endl; return -1; } configureSerialPort(fd); const char *send_data = "Test Message"; ssize_t written_bytes = write(fd, send_data, strlen(send_data)); if (written_bytes != static_cast<ssize_t>(strlen(send_data))) { std::cerr << "Write operation failed or incomplete!" << std::endl; } else { std::cout << "Message sent successfully." << std::endl; } char receive_buffer[256]; memset(receive_buffer, '\0', sizeof(receive_buffer)); ssize_t received_bytes = read(fd, receive_buffer, sizeof(receive_buffer)-1); if (received_bytes > 0) { std::cout << "Data Received: " << receive_buffer << std::endl; } else { std::cerr << "No data was available from the serial port." << std::endl; } close(fd); return 0; } ``` --- ### 注意事项 - **权限问题**:访问某些串口设备可能需要超级用户权限或者更改设备文件所属组。 - **错误处理**:建议增加更多的异常检测逻辑以便于调试复杂环境下的问题。 - **跨平台兼容性**:此方法适用于基于 Unix/Linux 的操作系统,Windows 平台需采用不同的方式完成相同的功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值