5303|8

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

16550做串口通信,遇到麻烦了 [复制链接]

16550做串口通信,如何判断FIFO是否为空?
现在老是读到空数据。用中断法也不大好控制。
(51单片机keil c51)

最新回复

我也不懂啊  详情 回复 发表于 2008-8-28 13:37
点赞 关注

回复
举报

66

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我给大家特别推荐的两款产品,非常棒!!!

1. c8051f 单片机(c2 ,jtag)和at89s5x单片机(isp)二合一串口编程下载线,支持3伏(c8051f 单片机),5伏(at89s5x单片机)电源,
目前通过实际验证可编程下载的芯片:c8051f310、c8051f320、c8051f330D、c8051f340、c8051f350、c8051f360、c8051f410、c8051f020、c8051f120、at89s51、at89s52、at89s8253等。

2. c8051f320 usb demo 板(是目前学习和应用usb 性价比特别高的一款单片机,资料全!上手快!)软硬件资源丰富:可提供硬件原理图;USB demo板上位机应用软件源代码(VB6 和VC6),以及usb底层驱动和驱动安装信息;USB demo板单片机固化程序的c51源代码。同样可以提供在keil下串口isd51源代码,可以硬件单步,连续运行和仿真!!!

陕西杨工c8051f单片机博客
手机 13002928013
http://c8051fmcu.blog.sohu.com
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
ps上面做广告的,把俺的问题解决了自然有人买你东西噻!
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
是BS不是ps。这种做烂广告的,应该封杀。

你用什么芯片?中断怎么不好用?有数据才产生中断,难道还会读到空的?
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

5
 
我一向都发音PS,哈哈

芯片是ST16C550,因数据流较快且长,中断后去处理时,不知FIFO中有多少数据,
通过判断LSR(线状态)的位0是否为1,然后去读数据直到LSR位0变为1,结果数据有些乱78糟了。

不知有没有这方面的源代码参考?
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
读LSR寄存器,如果bit 0等于1,表示FIFO中有数据,需要一直读到LSR的bit0为0;
我做过串口卡,这样处理是没错的,可能是你的芯片设置有问题,初始化时需要使能接受FIFO.
下面例子供参考(基于PC的,PC里面的SUPER IO芯片里面有两个16550兼容UART).

/* Name : Sample Comm's Program - 1024 Byte Buffer - buff1024.c */
/* Written By : Craig Peacock */
/* Copyright 1997 CRAIG PEACOCK */
/* See http://www.senet.com.au/~cpeacock/serial.htm */
/* For More Information */
#include
#include
#include
#define PORT1 0x2F8 /* Port Address Goes Here */
/* Defines Serial Ports Base Address */
/* COM1 0x3F8 */
/* COM2 0x2F8 */
/* COM3 0x3E8 */
/* COM4 0x2E8 */
#define INTVECT 0x0B /* Com Port's IRQ here */
/* (Must also change PIC setting) */
int bufferin = 0;
int bufferout = 0;
char ch;
char buffer[1025];
void interrupt (*oldport1isr)();
void interrupt PORT1INT() /* Interrupt Service Routine (ISR) for PORT1 */
{
    int c;
    do
    {
        c = inportb(PORT1 + 5);
        if (c & 1)
        {
            buffer[bufferin] = inportb(PORT1);

            bufferin++;
            if (bufferin == 1024) bufferin = 0;
        }
    }while (c & 1);
    outportb(0x20,0x20);
}

void dumpSioReg(int baseAddr)
{
    int i;
    printf("\nDump SIO register\n");
    for(i = 0; i< 8; i++)
    {
        printf("baseAddr + %d: 0x%x\n", i, inportb(baseAddr + i));
    }
}
void main(void)
{
    int c;

    outportb(PORT1 + 1 , 0); /* Turn off interrupts - Port1 */
    oldport1isr = getvect(INTVECT); /* Save old Interrupt Vector for */
/* later recovery */
    setvect(INTVECT, PORT1INT); /* Set Interrupt Vector Entry */
/* COM1 - 0x0C */
/* COM2 - 0x0B */
/* COM3 - 0x0C */
/* COM4 - 0x0B */
/* PORT 1 - Communication Settings */
    outportb(PORT1 + 3 , 0x80); /* SET DLAB ON */
    outportb(PORT1 + 0 , 0x03); /* Set Baud rate - Divisor Latch Low Byte */
/* Default 0x03 = 38,400 BPS */
/* 0x01 = 115,200 BPS */
/* 0x02 = 56,700 BPS */
/* 0x06 = 19,200 BPS */
/* 0x0C = 9,600 BPS */
/* 0x18 = 4,800 BPS */
/* 0x30 = 2,400 BPS */
    outportb(PORT1 + 1 , 0x00); /* Set Baud rate - Divisor Latch High Byte */
    outportb(PORT1 + 3 , 0x03); /* 8 Bits, No Parity, 1 Stop Bit */
    outportb(PORT1 + 2 , 0xC7); /* FIFO Control Register */

    outportb(PORT1 + 4 , 0x0B); /* Turn on DTR, RTS, and OUT2 */
    outportb(0x21,(inportb(0x21) & 0xF7)); /* Set Programmable Interrupt */
/* Controller */
/* COM1 (IRQ4) - 0xEF */
/* COM2 (IRQ3) - 0xF7 */
/* COM3 (IRQ4) - 0xEF */
/* COM4 (IRQ3) - 0xF7 */
    outportb(PORT1 + 1 , 0x01); /* Interrupt when data received */

    dumpSioReg(PORT1);   /*dump address*/
    printf("\nSample Comm's Program. Press ESC to quit \n");
    do
    {
        if (bufferin != bufferout)
        {
            ch = buffer[bufferout];
            bufferout++;
            if (bufferout == 1024) bufferout = 0;
            printf("%c",ch);
        }

        if (kbhit())
        {
            c = getch();
            outportb(PORT1, c);
        }
    } while (c !=27);
    outportb(PORT1 + 1 , 0); /* Turn off interrupts - Port1 */
    outportb(0x21,(inportb(0x21) | 0x08)); /* MASK IRQ using PIC */
/* COM1 (IRQ4) - 0x10 */
/* COM2 (IRQ3) - 0x08 */
/* COM3 (IRQ4) - 0x10 */
/* COM4 (IRQ3) - 0x08 */
    setvect(INTVECT, oldport1isr); /* Restore old interrupt vector */
}

 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
我也在用16C2550做开发,结果发现只能发送不能接收.CPU是Motorola的MC9S12DG128B,哪位给点意见啊. 100分帖子:

http://topic.eeworld.net/u/20080826/19/b24b2ee8-0718-4366-b6b9-b919e2c93ae6.html
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
看不懂
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

9
 
我也不懂啊
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表