提示信息

C语言中的串口编程详解

字迹 已关注

在C语言中进行串口编程通常涉及操作系统提供的API。以下是针对Windows和Linux系统的串口编程的基本步骤和代码示例。

Windows中的串口编程

在Windows上,串口是通过Win32 API来进行操作的。下面是一个简单的实现示例:

  1. #include <windows.h>
  2. #include <stdio.h>
  3. void configureSerialPort(HANDLE hSerial) {
  4. DCB dcbSerialParams = {0};
  5. dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
  6. if (!GetCommState(hSerial, &dcbSerialParams)) {
  7. printf("Error getting state\n");
  8. return;
  9. }
  10. dcbSerialParams.BaudRate = CBR_9600;
  11. dcbSerialParams.ByteSize = 8;
  12. dcbSerialParams.StopBits = ONESTOPBIT;
  13. dcbSerialParams.Parity = NOPARITY;
  14. if (!SetCommState(hSerial, &dcbSerialParams)) {
  15. printf("Error setting state\n");
  16. }
  17. }
  18. int main() {
  19. HANDLE hSerial = CreateFile("\\\\.\\COM3",
  20. GENERIC_READ | GENERIC_WRITE,
  21. 0,
  22. 0,
  23. OPEN_EXISTING,
  24. FILE_ATTRIBUTE_NORMAL,
  25. 0);
  26. if (hSerial == INVALID_HANDLE_VALUE) {
  27. printf("Error opening serial port\n");
  28. return 1;
  29. }
  30. configureSerialPort(hSerial);
  31. // Example: writing data
  32. char data[] = "Hello, Serial Port!";
  33. DWORD bytesWritten;
  34. if (!WriteFile(hSerial, data, sizeof(data), &bytesWritten, NULL)) {
  35. printf("Error writing to serial port\n");
  36. }
  37. CloseHandle(hSerial);
  38. return 0;
  39. }

Linux中的串口编程

在Linux上,串口编程主要通过文件I/O和termios接口。以下是一个简单的实现示例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <fcntl.h>
  6. #include <termios.h>
  7. void configureSerialPort(int fd) {
  8. struct termios tty;
  9. memset(&tty, 0, sizeof tty);
  10. if (tcgetattr(fd, &tty) != 0) {
  11. printf("Error getting tty attributes\n");
  12. return;
  13. }
  14. cfsetospeed(&tty, B9600);
  15. cfsetispeed(&tty, B9600);
  16. tty.c_cflag &= ~PARENB; // No parity
  17. tty.c_cflag &= ~CSTOPB; // One stop bit
  18. tty.c_cflag &= ~CSIZE;
  19. tty.c_cflag |= CS8; // 8 bits per byte
  20. tty.c_cflag |= CREAD | CLOCAL; // Turn on READ & ignore ctrl lines
  21. tty.c_lflag &= ~ICANON;
  22. tty.c_lflag &= ~ECHO;
  23. tty.c_lflag &= ~ECHOE;
  24. tty.c_lflag &= ~ECHONL;
  25. tty.c_lflag &= ~ISIG;
  26. tty.c_iflag &= ~(IXON | IXOFF | IXANY); // Turn off s/w flow ctrl
  27. tty.c_oflag &= ~OPOST; // Prevent special interpretation of output bytes
  28. tty.c_oflag &= ~ONLCR; // Prevent conversion of newline to carriage return/line feed
  29. tty.c_cc[VTIME] = 10; // Wait for up to 1s (10 deciseconds), returning as soon as any data is received.
  30. tty.c_cc[VMIN] = 0;
  31. if (tcsetattr(fd, TCSANOW, &tty) != 0) {
  32. printf("Error setting tty attributes\n");
  33. }
  34. }
  35. int main() {
  36. int serialPort = open("/dev/ttyS0", O_RDWR);
  37. if (serialPort < 0) {
  38. printf("Error opening serial port\n");
  39. return 1;
  40. }
  41. configureSerialPort(serialPort);
  42. // Example: writing data
  43. char data[] = "Hello, Serial Port!";
  44. write(serialPort, data, sizeof(data));
  45. close(serialPort);
  46. return 0;
  47. }

注意事项

  • 确保指定的串口号在系统中存在。
  • 合理设置波特率、数据位、停止位和校验位等参数。
  • 串口通信时需要考虑接收和发送的缓冲处理。
  • Windows和Linux对串口设备的访问权限和方法有所不同,注意权限设置和设备路径。

以上仅为基本的示例,实际应用中可能需要根据具体需求调整配置。

    遇到难题? "AI大模型GPT4.0、GPT" 是你的私人解答专家! 点击按钮去提问......
字迹 关注 已关注

最近一次登录:2024-11-19 23:47:41   

暂时还没有签名,请关注我或评论我的文章
×
免费图表工具,画流程图、架构图