C Serial Port Programming Tutorial23


Serial communication is a method of transmitting data one bit at a time over a physical link. It is commonly used for communication between microcontrollers, embedded systems, and computers. In this tutorial, we will learn how to write a simple C program to send and receive data through a serial port.Prerequisites

Before we start, make sure you have the following:* A computer with a serial port (or a USB-to-serial converter)
* A microcontroller or embedded system with a serial port
* A C compiler (e.g., gcc)
Setting Up the Hardware

First, you need to connect the serial port of your microcontroller or embedded system to the serial port of your computer. If you are using a USB-to-serial converter, connect it to the USB port of your computer and then connect the serial cable to the converter.Writing the C Program

Now, let's write a simple C program to send and receive data through the serial port.```c
#include
#include
#include
#include
int main() {
int fd;
struct termios options;
// Open the serial port
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY);
if (fd == -1) {
perror("open");
return EXIT_FAILURE;
}
// Set the serial port options
tcgetattr(fd, &options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
options.c_cflag |= (CLOCAL | CREAD);
tcsetattr(fd, TCSANOW, &options);
// Write data to the serial port
const char *data = "Hello, world!";
write(fd, data, strlen(data));
// Read data from the serial port
char buffer[1024];
int n = read(fd, buffer, sizeof(buffer));
buffer[n] = '\0';
printf("%s", buffer);
// Close the serial port
close(fd);
return EXIT_SUCCESS;
}
```
Explanation

The program starts by including the necessary header files.```c
#include
#include
#include
#include
```

Next, it opens the serial port using the `open()` system call. The first argument to `open()` specifies the path to the serial port. In this case, we are using `/dev/ttyUSB0`, which is the default serial port on most Linux systems. The second argument specifies the flags to open the port with. We are using `O_RDWR` to open the port for reading and writing, and `O_NOCTTY` to prevent the port from becoming the controlling terminal for the process.```c
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY);
```

If the serial port cannot be opened, the program prints an error message and exits.```c
if (fd == -1) {
perror("open");
return EXIT_FAILURE;
}
```

Next, the program sets the serial port options using the `tcgetattr()` and `tcsetattr()` system calls. The `tcgetattr()` system call gets the current options for the port, and the `tcsetattr()` system call sets the new options.```c
tcgetattr(fd, &options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
options.c_cflag |= (CLOCAL | CREAD);
tcsetattr(fd, TCSANOW, &options);
```

The following options are set:* `B9600`: Sets the baud rate to 9600 baud.
* `CLOCAL`: Ignores modem control lines.
* `CREAD`: Enables the receiver.

Next, the program writes data to the serial port using the `write()` system call.```c
const char *data = "Hello, world!";
write(fd, data, strlen(data));
```

The first argument to `write()` specifies the file descriptor for the serial port. The second argument specifies the data to write. The third argument specifies the length of the data to write.

Next, the program reads data from the serial port using the `read()` system call.```c
char buffer[1024];
int n = read(fd, buffer, sizeof(buffer));
buffer[n] = '\0';
printf("%s", buffer);
```

The first argument to `read()` specifies the file descriptor for the serial port. The second argument specifies the buffer to read the data into. The third argument specifies the length of the buffer. The `read()` system call returns the number of bytes read. The program then adds a null terminator to the end of the buffer and prints the data to the console.

Finally, the program closes the serial port using the `close()` system call.```c
close(fd);
```

That's it! You have now written a simple C program to send and receive data through a serial port.Troubleshooting

If you are having problems getting your program to work, here are some things to try:* Make sure that the serial port is connected properly.
* Make sure that the serial port is configured correctly.
* Make sure that the baud rate of your program matches the baud rate of the serial port.
* Make sure that the data format of your program matches the data format of the serial port.
* Try using a different serial port.
* Try using a different microcontroller or embedded system.

2024-12-05


Previous:Create a Charming Fishbowl Phone Case: Video Tutorial

Next:How to Set Up Remote Monitoring on Hikvision Cameras for Mobile Devices