在eCos源码包的examples中有一个串口编程的应用例子。针对stm32平台,串口也可以这样应用吗?在eCos的stm32应用中,我们还需要移植或编写串口驱动吗?还是eCos中已有stm32的串口驱动了吗?
带着这些疑问和问题,我们一一来解开这些疑团!
串口驱动
实际上,eCos中已实现了stm32的串口驱动。但eCos中提供的模板(Templates)没有配置为使能。因此,如果我们要在应用程序中使用串口,则需要配置它为使能状态。
串口驱动的配置项名称:ST STM3210E EVAL board,默认值:禁止。
在图形配置工具中,搜索找到这个配置项,然后使能它。如下图所示。
串口驱动配置项的子配置项可根据需要修改(如修改波特率、设备名等),默认情况下,只使能了串口1和串口2的驱动。
串口编程
eCos串口编程也很简单,甚至比linux的还要简单。利用eCos的I/O子系统,可以非常快捷的编写出一个应用示例,就像eCos源码包中examples的serial示例那样。
需要开启eCos的I/O子系统,默认是启用的,如下图所示。
有一点与examples的serial示例不同,那就是指定的设备名不一样了,应该是:”/dev/ser0″。
包含的头文件:
#ifdef CYGPKG_IO_SERIAL # include <pkgconf/io_serial.h> #endif #include <cyg/io/io.h> /* I/O functions */
应用实例:
static void test_thread_(cyg_addrword_t data)
{
cyg_io_handle_t handle;
Cyg_ErrNo err;
cyg_uint32 len;
char buf[1];
err = cyg_io_lookup("/dev/ser0", &handle);
if (ENOERR != err) {
diag_printf("Open /dev/ser0 failed!\n");
diag_printf("Please check if enable 'CYGPKG_IO_SERIAL_DEVICES' or not.\n");
return;
}
diag_printf("%s\n", TEST_HELP_INFO);
while(1) {
len = sizeof(buf);
err = cyg_io_read(handle, buf, &len);
if (ENOERR == err) {
switch (buf[0]) {
case '0': test_gpio_led(); break;
case 'h': diag_printf("%s\n", TEST_HELP_INFO); break;
default:
diag_printf("\n!!!Invalid enter!!!\n\n");
diag_printf("%s\n", TEST_HELP_INFO);
break;
}
} else {
diag_printf("Read failed from serial!\n");
}
}
}
上面的应用例子中:
err = cyg_io_lookup(“/dev/ser0”, &handle),打开串口1设备;err = cyg_io_read(handle, buf, &len),从串口设备读取指定长度的数据。
注:这个示例是我正在编写的测试程序的一部分。有些定义没有给出来,所以直接使用的话,会编译不过。但串口编程应用很简单,就是2步:使用cyg_io_lookup()函数打开串口设备,使用cyg_io_read()或cyg_io_write()函数从串口中读写数据。


串口驱动的配置项名称:ST STM3210E EVAL board,默认值:禁止。
要使能他,请问怎么使能啊,修改cdl,配置界面上没看到可以使能他的项啊