首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 16550做串口通信,遇到麻烦了 [已结帖,结帖人:wlxu1209]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wlxu1209
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-21 15:36:20 楼主
    16550做串口通信,如何判断FIFO是否为空?
    现在老是读到空数据。用中断法也不大好控制。
    (51单片机keil c51)
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yang96381
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 16:06:311楼 得分:5
    该回复于2008-10-18 16:43:24被版主删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wlxu1209
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 17:45:022楼 得分:0
    ps上面做广告的,把俺的问题解决了自然有人买你东西噻!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • shuiyan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 3

    发表于:2008-08-21 18:15:553楼 得分:5
    是BS不是ps。这种做烂广告的,应该封杀。

    你用什么芯片?中断怎么不好用?有数据才产生中断,难道还会读到空的?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wlxu1209
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 21:46:004楼 得分:0
    我一向都发音PS,哈哈

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

    不知有没有这方面的源代码参考?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • curious_cat
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 00:34:145楼 得分:75
    读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 <cpeacock@senet.com.au> */
    /* Copyright 1997 CRAIG PEACOCK <cpeacock@senet.com.au> */
    /* See http://www.senet.com.au/~cpeacock/serial.htm */
    /* For More Information */
    #include <dos.h>
    #include <stdio.h>
    #include <conio.h>
    #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 */
    }

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mochen5460
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-26 19:34:226楼 得分:5
    我也在用16C2550做开发,结果发现只能发送不能接收.CPU是Motorola的MC9S12DG128B,哪位给点意见啊. 100分帖子:

    http://topic.csdn.net/u/20080826/19/b24b2ee8-0718-4366-b6b9-b919e2c93ae6.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • a54963369
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-28 10:17:267楼 得分:5
    看不懂
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yifuzhiming
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-28 13:37:048楼 得分:5
    我也不懂啊
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved