首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言中的数据链路层编程

C语言中的数据链路层编程
EN

Stack Overflow用户
提问于 2015-10-12 04:53:45
回答 1查看 1.7K关注 0票数 0

我对这件事完全是新手,我想知道从哪里开始..。

我有一个手册,它指定数据链接层,其中包括命令和响应帧,以访问连接在/dev/ttyUSB0 0中的设备。

给定命令帧的示例是设置波特率

= 0x0A

地址=空/空

长度= 0x03

命令= 0x20

参数= 0x00

Check = cc

其中参数0x00等于波特率9600 baud。

我的问题是如何在编程中使用这个?我能用C语言吗?

我的操作系统平台是ubuntu12.04。

任何联系或想法都会有很大帮助。

UPDATE这是我在read()中使用的命令

代码语言:javascript
复制
    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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-12 06:40:17

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

代码语言:javascript
复制
// 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。一个简单的例子:

代码语言:javascript
复制
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);
}

然后,您可以简单地从串行行读取

代码语言:javascript
复制
res = read (serial_fd, rx_buffer, RX_buffer_len);

并使用

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33073506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档