data link layer programming in c
data link layer programming in c
我对这件事完全是新手,我想知道从哪里开始..
我有一本手册指定数据 link 层,其中包括命令和响应帧以访问 /dev/ttyUSB0.
[=27= 中连接的设备]
给定命令帧的示例是设置波特率
头 = 0x0A
地址 = NULL/blank
长度 = 0x03
命令 = 0x20
参数 = 0x00
检查 = cc
其中参数0x00等于波特率9600bps。
我的问题是如何在编程中使用它?可以在C语言上使用吗?
我的 OS 平台是 ubuntu 12.04.
任何 link 或想法都会有很大的帮助。
更新
这是我在 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);
我对这件事完全是新手,我想知道从哪里开始..
我有一本手册指定数据 link 层,其中包括命令和响应帧以访问 /dev/ttyUSB0.
[=27= 中连接的设备]
给定命令帧的示例是设置波特率
头 = 0x0A
地址 = NULL/blank
长度 = 0x03
命令 = 0x20
参数 = 0x00
检查 = cc
其中参数0x00等于波特率9600bps。
我的问题是如何在编程中使用它?可以在C语言上使用吗?
我的 OS 平台是 ubuntu 12.04.
任何 link 或想法都会有很大的帮助。
更新 这是我在 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);