目录
打开ftdi USB设备后就可以配置串口参数并进行通信。FTDI设备默认是串口的模式。
1. 设置波特率
int ftdi_set_baudrate(struct ftdi_context *ftdi, int baudrate)
参数说明:
- ftdi - 上下文对象
- baudrate - 串口的波特率
返回值说明:
- 0 - 表示设置OK
- -1 - 该波特率不支持
- -2 - 设置波特率失败
- -3 - USB设备无效
参考例程:
ret = ftdi_set_baudrate(ftdi, 115200);
if(ret < 0)
{
printf("Set Baudrate Fail: %d\n", ret);
ftdi_usb_close(ftdi);
ftdi_list_free(&devlist);
ftdi_free(ftdi);
return EXIT_FAILURE;
}
2. 设置数据位/停止位/校验方式/断开类型
int ftdi_set_line_property2(struct ftdi_context *ftdi, enum ftdi_bits_type bits,
enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity,
enum ftdi_break_type break_type)
参数说明:
- ftdi - 上下文对象
- bits - 数据位大小
enum ftdi_bits_type { BITS_7=7, BITS_8=8 };
- sbit - 停止位大小
enum ftdi_stopbits_type { STOP_BIT_1=0, STOP_BIT_15=1, STOP_BIT_2=2 };
- parity - 校验方式
enum ftdi_parity_type { NONE=0, ODD=1, EVEN=2, MARK=3, SPACE=4 };
- break_type - 断开类型
enum ftdi_break_type { BREAK_OFF=0, BREAK_ON=1 };
返回值说明:
- 0 - 表示设置OK
- -1 - 设置失败
- -2 - USB设备无效
参考例程:
ret = ftdi_set_line_property2(ftdi, BITS_8, STOP_BIT_1, NONE, BREAK_OFF);
if(ret < 0)
{
printf("Set Line Property Fail: %d\n", ret);
ftdi_usb_close(ftdi);
ftdi_list_free(&devlist);
ftdi_free(ftdi);
return EXIT_FAILURE;
}
3. 发送数据
3.1 设置块大小
设置发送数据时一次USB通讯的大小。
int ftdi_write_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize)
参数说明:
- ftdi - 上下文对象
- chunksize - 块大小,默认是4KB,这个值的范围为64 - 64KB,而且必须是64的整数倍。
可以通过函数ftdi_write_data_get_chunksize获取当前的设定。
int ftdi_write_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize)
3.2 发送
int ftdi_write_data(struct ftdi_context *ftdi, const unsigned char *buf, int size)
返回值说明:
- -666 - USB设备无效
- < 0 - 发送失败
- > 0 - 成功发送的数据长度
参考例程:
unsigned char wrData[] = "Serial Data\n";
ret = ftdi_write_data(ftdi, wrData, sizeof(wrData));
if(ret != sizeof(wrData))
{
printf("Write Data Fail: %d\n", ret);
ftdi_usb_close(ftdi);
ftdi_list_free(&devlist);
ftdi_free(ftdi);
return EXIT_FAILURE;
}
4. 接收数据
4.1 设置块大小
功能类似发送数据时的设置块大小。
int ftdi_read_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize)
4.2 接收
int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size)
返回值说明:
- -666 - USB设备无效
- < 0 - 接收失败
- > 0 - 成功接收到的数据长度
参考例程(把TxD和RxD短路,然后新增加#include <unistd.h>):
ret = 0;
unsigned char rdData[128];
while(ret < sizeof(wrData))
{
usleep(1 * 1000);
int num = ftdi_read_data(ftdi, rdData + ret, 128 - ret);
if(num <= 0)
break;
ret += num;
}
rdData[ret + 1] = 0;
printf("Read Data: %s\n", rdData);
运行结果:
libftdi-example$ sudo ./libftdi1-example
version:1.5.0, 1.5
Number of FTDI devices found: 1
Manufacturer: FTDI, Description: FT4232H MiniModule, Serial: FT8NZV77
Open device OK: 0
Read Data: Serial Data
5. 设置延迟时间
延迟时间(latency timer)用于设置USB通讯的间隔时间,这个值越小,USB通讯越频繁,一般建议最小2ms。
int ftdi_set_latency_timer(struct ftdi_context *ftdi, unsigned char latency)
参数说明:
- ftdi - 上下文对象
- latency - 延迟时间,有效值范围1-255
返回值说明:
- 0 - 设置成功
- -1 - 延迟时间参数无效
- -2 - 无法设置延迟时间
- -3 - USB设备无效
可以通过ftdi_get_latency_timer获取当前的配置值。
参考例程:
unsigned char latency;
ftdi_get_latency_timer(ftdi, &latency);
printf("Current Latency Setting: %d\n", latency);
ftdi_set_latency_timer(ftdi, 1);
ftdi_get_latency_timer(ftdi, &latency);
printf("New Latency Setting: %d\n", latency);
运行结果:
libftdi-example$ sudo ./libftdi1-example
version:1.5.0, 1.5
Number of FTDI devices found: 1
Manufacturer: FTDI, Description: FT4232H MiniModule, Serial: FT8NZV77
Open device OK: 0
Read Data: Serial Data
Current Latency Setting: 16
New Latency Setting: 1