数据链路层的c语言编程



我对这事完全是新手,我想知道从哪里开始…
我有一个手册,指定数据链路层,包括命令和响应帧访问连接在/dev/ttyUSB0的设备。

命令框的示例是设置波特率

Head = 0x0A
地址 = NULL/blank
长度 = 0x03
命令 = 0x20
参数 = 0x00
Check = cc



参数0x00 =波特率9600bps。我的问题是如何在编程中使用它?我可以在C语言上使用它吗?
我的操作系统是ubuntu 12.04。
任何链接或想法将是一个很大的帮助。

这是我在read()

中使用的命令
    unsigned char rx_buffer[1024];
    size_t RX_buffer_len;
    ssize_t bytes_read;
    int fd;
    RX_buffer_len = sizeof(rx_buffer);
    bytes_read = read (serial, rx_buffer, RX_buffer_len);

您可以开始定义您的数据包消息结构

// Enable 1 byte alignment
#pragma pack(1)
typedef struct
{
    uint8_t Head;
    uint8_t Address;
    uint8_t Length;
    uint8_t Command;
    uint8_t Parameter;
    uint8_t Check;
}typ_packet;
// Restore the original alignment
#pragma pack()

则可以访问并配置ttyUSB0。一个简单的例子:

struct termios2 t;
int serial, baud;
// Open the uart low level device driver and set up all params
serial_fd = open("/dev/ttyUSB0", O_NOCTTY | O_NDELAY);
if (serial != -1)
{
    baud = 9600;
    if (ioctl(serial, TCGETS2, &t))
    {
        // Fails to read tty pars
        exit(1);
    }
    t.c_cflag &= ~CBAUD;
    t.c_cflag |= BOTHER;
    t.c_cflag |= CSTOPB;
    t.c_ospeed = baud;
    // Noncanonical mode, disable signals, extended
    // input processing, and echoing
    t.c_lflag &= ~(ICANON | ISIG | IEXTEN | ECHO);
    // Disable special handling of CR, NL, and BREAK.
    // No 8th-bit stripping or parity error handling.
    // Disable START/STOP output flow control.
    t.c_iflag &= ~(BRKINT | ICRNL | IGNBRK | IGNCR | INLCR |
                      INPCK | ISTRIP | IXON | PARMRK);
    // Disable all output processing
    t.c_oflag &= ~OPOST;
    if (ioctl(serial, TCSETS2, &t))
    {
        // Failed to set serial parameters
        exit(1);
    }
}
else
{
    // Failed to open ttyUSB0
    exit(1);
}

那么你可以简单地通过

从串行行读取
res = read (serial_fd, rx_buffer, RX_buffer_len);

typ_packet packet;
packet.Head = 0x0A;
packet.Address = 0x00;
packet.Length = 0x03;
packet.Command = 0x20;
packet.Parameter = 0x00;
packet.Check = 0xCC;
write(serial_fd, &packet, 6);

最新更新