关于 nios II的串口打印
niso II 开发环境以文件的形式来管理串口通信,对于用户来说确实方便了很多,基本上让用户找到了学习C语言的感觉。只要认真学过C语言的文件那一章的,使用NIOS II串口来应该会倍感亲切。但是我在使用串口来调试我得摄像头时,感觉很不方便。我要实现的功能很简单,把一个很大的数组中的内容传回给上位机,但是nios II似乎并没有很好地解决这个问题,因为我忙活了几天,发现nios II中的hal 支持的只是在键盘上能敲出来的些字符。我不知道该怎么描述,但是确实发现用串口传回0x30是可以的,但是传回0x00就不行了。当然我发现很多串口调试助手也是不认识这些字符的,因为串口调试助手一般都是把字符用ASC II 码打印出来的,比如我在试验的时候使用的正点原子的串口调试助手。
因为我要传的是图片的数据,使用的是上位机看图软件,使用NIOS II 的hal文件时一旦遇到了那些串口调试助手打印不出来的的数据,串口就罢工了。
最后被逼无奈,只好自己来写驱动软件了,参考了下《nios II 那些事儿》中的串口程序,真的看得有点难受,只能怪当年C++没有怎么学好吧。虽然粘贴复制后程序编译没有任何错误,但是就是打印不出来任何内容。虽然以前开了点DSP2812的编程风格和这程序的风格非常相似,但是让我亲自来调试我还是感觉无从下手。
最后只好自己来写程序了,其实直接去操作寄存器很简单的,只是程序风格没有人家那么好啦! 因为人家可以随意地操作到寄存器的每一位嘛。
程序当然很简单的啦,因为我得需要不需要接受数据,就是自己写了点传出去的程序,也不要中断。
代码简单得都有点不好意思上啦。呵呵
#include "../inc/uart.h"
#include "altera_avalon_uart_regs.h"
#include <stdio.h>
#include"unistd.h"
//to transfer a byte of data
//parameter :the data to translate
alt_u8 Uart_Send_Byte(alt_u8 data)
{
//UART->TXDATA.BITS.TRANSMIT_DATA = data;
usleep(100);//delay for some time no response but necessary
IOWR_ALTERA_AVALON_UART_TXDATA(UART_BASE, data);
while((IORD_ALTERA_AVALON_UART_STATUS(UART_BASE)&0x40)==1);
return success;
}
void Uart_Sent_String(alt_u8 *buffer, alt_32 len)
{
while(len--)
Uart_Send_Byte(*buffer++);
}
alt_u8 Set_Baudrate(alt_32 baudrate)
{
IOWR_ALTERA_AVALON_UART_DIVISOR(UART_BASE,UART_FREQ/baudrate+0.5);
return success;
}
void Uart_Init(void)
{
Set_Baudrate(115200);
IOWR_ALTERA_AVALON_UART_STATUS(UART_BASE,0);
}
只需要去看看altera 的外设说明文档中关于uart core的寄存器讲述都明白的。至于接受部分应该也很随意的,不过在单字节传送中用了个延时,我自己都没法解释,因为不用打印的数据会丢失。具体情况搞不清楚,实在是在调试的时候被逼无奈加上去的,倒是希望有个明白人能给我解释下。反正最后的效果差不多了,放了个图片文件进去,接近两万个字节,打印回来数据倒是一个都没有丢失。