此前一直在做microblaze的uart的编程,但是无奈,Xilinx提供的驱动感觉不是非常的靠谱,很多时候,查看接收它提供的uart的接收函数,明明看见接收FIFO中在没有有效数据或者接收到足够的数据时就会退出相应的接收的状态。但是我在实际编程中却发现,如果你代码中要接收5byte的数据,只要接收没有完全,就不会产生中断。这个让我调试时感到很是纠结,就是一直在等待数据的接收完成,原来以为是查询模式下才会出现的问题,但是,后来,中断模式下也是这个问题,然后我就服了。由于发送数据的时候,自己要发送多少数据一般都是可以通过程序计算出来的,所以,我贴出发送端的代码也没有什么意思。
我的这段代码是参考网上的一位博主的文章,原博主我现在已经找不到了,只是发现伟大的百度文库上有这篇文章《Microblaze的串口收发》,实际测试中,发现它的这段代码不能够接收全部的数据,就是在接收到比较长的连续数据时,会有部分数据丢失,我不知道是他代码的原因还是我移植的问题。后来我把代码修改成为了,当末尾接收到\r\n时,退出接收程序,而接收我也没有使用Xilinx的驱动。
在利用这段代码前,请先参考网上其他的Microblaze中断编程的博文配置好uart的中断。
void uart_rx_Handler(void *CallBackRef, unsigned int ByteCount)
{
XUartLite *InstancePtr=(XUartLite*)CallBackRef;
int i=0;
while(1)
{
if(!(XUartLite_IsReceiveEmpty(InstancePtr->RegBaseAddress)))
{
buff[i]=XUartLite_ReadReg(InstancePtr->RegBaseAddress,XUL_RX_FIFO_OFFSET);
}
if(buff[i-1]==0x0A)break;
}
buff[i]=0;
//print anything recv from uartlite
xil_printf(buff);
}
因为这段代码我是直接从项目的代码中删除那些在这里我认为是多余的部分,也没有经过测试就直接贴上来的,如果有跑不通的欢迎指出。