打印

2812SCIA利用FIFO与PC机进行串口通信

[复制链接]
3185|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jijiali|  楼主 | 2013-1-29 09:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
2812SCIA利用FIFO与PC机进行串口通信时,利用中断实现。就是当在串口调试助手上输入发送内容,2812利用接收中断接到内容,再利用发送中断发给PC在串口调试助手上显示。我有些地方不明白,请给位大牛指教:
1.当程序运行,在串口调试助手输入内容后,点击发送,可以实现通信。但是我想知道,2812发送端和接收端的波形在示波器上是什么样子?
2、当我把仿真器跟2812连接断开时,发送窗口输入内容,再次点击发送,接收区仍能有数据显示。难道,此时不需要2812.也能实现串口通信。实在费解。请各位不吝赐教,本人刚接触2812.

相关帖子

沙发
jlass| | 2013-1-29 09:53 | 只看该作者
1、波形无非是高高低低,速度就是波特率
2、要么硬件有问题,收发短路了,要么2812仍然在运行(如果你是点击run后再把仿真器把下来就是这种情况)

使用特权

评论回复
板凳
jijiali|  楼主 | 2013-1-29 09:58 | 只看该作者
to jilass:哦,我觉得波形也应该是高低电平。但是我打出来不是啊。但是通信时,发的什么,收到就是什么。这不能叫做通信成功吗?第二点是我把2812运行,然后发送端接收端不与串口线连接仍然可以通信,是怎么回事?

使用特权

评论回复
地板
jlass| | 2013-1-29 10:10 | 只看该作者
jijiali 发表于 2013-1-29 09:58
to jilass:哦,我觉得波形也应该是高低电平。但是我打出来不是啊。但是通信时,发的什么,收到就是什么。这 ...

从你的描述来看,你根本没有通信成功,要么你的收发短路了,要么你所谓收到的数据其实是你的发送打印而已。

使用特权

评论回复
5
jijiali|  楼主 | 2013-1-29 10:19 | 只看该作者
我估摸着是短路了,所以换了一块测试版,结果这次,刚一运行程序,输入发送内容后,接收窗口就受到一些00000,但是一会儿就又没了》这是怎么回事?

使用特权

评论回复
6
zhangmangui| | 2013-1-29 10:24 | 只看该作者
嗯  如果用示波器看发送和接收的波形的话  就是高低高低的数据按一定的规律和波特率的速度进行传输的
关于你将仿真器拔掉还能通信的问题  似乎我也遇到过  当你在程序run时,拔掉仿真器  只要别断电  程序还是
在运行的   虽然你还没有烧到flash中去   正常   不见得是硬件有问题或收发短接啦

使用特权

评论回复
7
jijiali|  楼主 | 2013-1-29 10:33 | 只看该作者
版主也遇到过啊,但是你试过将你的发送端,接收端打出来,是高低电平吗?我的不是啊,就3.3V的高电平》想问问是哪里出现了问题呢?纠结一天了

使用特权

评论回复
8
jijiali|  楼主 | 2013-1-29 10:55 | 只看该作者
本帖最后由 jijiali 于 2013-1-29 11:10 编辑
zhangmangui 发表于 2013-1-29 10:24
嗯  如果用示波器看发送和接收的波形的话  就是高低高低的数据按一定的规律和波特率的速度进行传输的
关于 ...


我刚刚又试了一下,数据正常发送接收的时候,我有时候可以观察到高高低低的(正弦波????),会不会是示波器要设置什么触发之类的东西呢?

使用特权

评论回复
9
jlass| | 2013-1-29 11:12 | 只看该作者
jijiali 发表于 2013-1-29 10:55
我刚刚又试了一下,数据正常发送接收的时候,我有时候可以观察到高高低低,会不会是示波器要设置什么触发 ...

你先自己调一下吧,理一理头绪,别急着问问题。思考很重要。:)

使用特权

评论回复
10
jijiali|  楼主 | 2013-1-29 11:15 | 只看该作者
jlass 发表于 2013-1-29 11:12
你先自己调一下吧,理一理头绪,别急着问问题。思考很重要。

恩,思考着的。越思考问题越多,想把串口弄好,哈哈。不过也可以学到东西

使用特权

评论回复
11
zhangmangui| | 2013-1-29 11:33 | 只看该作者
jijiali 发表于 2013-1-29 10:55
我刚刚又试了一下,数据正常发送接收的时候,我有时候可以观察到高高低低的(正弦波????),会不会是 ...

刚我试了一下   波特率115200  看到的都是方波

使用特权

评论回复
12
zhangmangui| | 2013-1-29 11:35 | 只看该作者
jijiali 发表于 2013-1-29 10:33
版主也遇到过啊,但是你试过将你的发送端,接收端打出来,是高低电平吗?我的不是啊,就3.3V的高电平》想问 ...

检测串口  短路自发自收  如果合适  在检查程序  在线仿真  查看寄存器的值

使用特权

评论回复
13
jijiali|  楼主 | 2013-1-29 11:45 | 只看该作者
zhangmangui 发表于 2013-1-29 11:35
检测串口  短路自发自收  如果合适  在检查程序  在线仿真  查看寄存器的值 ...

这个活儿已经干过咯,都没问题。主要是示波器不太会。可以观察到在发送接收了。顺便问一句,我还想写个用FIFO功能实现2812直接向PC发送的测试程序。是不是也需要发送接收中断实现呢?看了些资料,感觉思路不清楚。
谢谢斑竹哦,还亲自测试一下!遇到我这种菜鸟,够为民请命。我会常来顶贴的,哈哈。

使用特权

评论回复
14
zhangmangui| | 2013-1-29 13:53 | 只看该作者
jijiali 发表于 2013-1-29 11:45
这个活儿已经干过咯,都没问题。主要是示波器不太会。可以观察到在发送接收了。顺便问一句,我还想写个用 ...

interrupt void SCIRXINTA_ISR(void)     // SCI-A
{
        unsigned char i;           //ReceivedAChar;
        DINT;//关闭总中断

           // 数据接收
           //temp=SciaRegs.SCIFFRX.bit.RXFIFST;         //数据长度
    for(i=0;i<5;i++)
        {
                Receviced_data = SciaRegs.SCIRXBUF.all;
                //ReceivedAChar = SciaRegs.SCIRXBUF.all;
                //Receviced_data = ReceivedAChar;     //接收串口数据
                Receviced_data[4] = '\0';
        }
          
        flag=1;                                  //表示接受完成
        SciaRegs.SCIFFRX.bit.RXFIFORESET=0;      //将FIFO指针复位为0
        for(i=0;i<20;i++); //延时
        SciaRegs.SCIFFRX.bit.RXFIFORESET=1;      //退出复位状态
           SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;     // 清除接收中断标志
    SciaRegs.SCIFFRX.bit.RXOVF_CLR = 1;      //清除溢出中断标志
        PieCtrl.PIEACK.all |= M_INT9;            //响应中断
        EINT;   //开总中断
}

interrupt void SCITXINTA_ISR(void)     // SCI-A
{
        unsigned char ReceivedAChar;
        DINT;//关闭总中断
       
        //自动侦测波特率处理
        if(SciaRegs.SCIFFCT.bit.ABD == 1)
           {
            SciaRegs.SCIFFCT.bit.ABDCLR = 1; //清除ABD
              SciaRegs.SCIFFCT.bit.CDC = 0; //禁止自动波特率侦测
              ReceivedAChar = SciaRegs.SCIRXBUF.all;
                SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;//清除中断标志位
                SciaRegs.SCIFFRX.bit.RXFIFORESET=0; //将FIFO指针复位为0
                SciaRegs.SCIFFRX.bit.RXFIFORESET=1; //退出复位状态
              if(ReceivedAChar == 'A')
                {        
                        Send_String_SCIA("right!");//        Autobaud
                        SciaRegs.SCIFFRX.bit.RXFFIENA = 1;// 使能SCIA FIFO接收中断
                        connect_right = 1;
                }       
              else
              {
                      Send_String_SCIA("wrong!");  //        Autobaud
                        connect_right = 0;
                }
           }
       
        SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;//清除中断标志位
        PieCtrl.PIEACK.all |= M_INT9;   //响应中断
        EINT;   //开总中断
}

使用特权

评论回复
15
zhangmangui| | 2013-1-29 13:54 | 只看该作者
zhangmangui 发表于 2013-1-29 13:53
interrupt void SCIRXINTA_ISR(void)     // SCI-A
{
        unsigned char i;           //ReceivedAChar;

我以前用过的程序  看看  能不能帮上你

使用特权

评论回复
16
zhangmangui| | 2013-1-29 13:56 | 只看该作者
这里我会想办法分享视频的  到时候看看
https://bbs.21ic.com/icview-434831-1-1.html

使用特权

评论回复
17
jijiali|  楼主 | 2013-1-29 15:54 | 只看该作者
zhangmangui 发表于 2013-1-29 13:56
这里我会想办法分享视频的  到时候看看
https://bbs.21ic.com/icview-434831-1-1.html

好的,不胜感激

使用特权

评论回复
18
jlass| | 2013-1-29 15:57 | 只看该作者
zhangmangui 发表于 2013-1-29 13:54
我以前用过的程序  看看  能不能帮上你

授人以鱼不如授人以渔,你太直接了:curse:

使用特权

评论回复
19
jijiali|  楼主 | 2013-1-29 16:11 | 只看该作者
jlass 发表于 2013-1-29 15:57
授人以鱼不如授人以渔,你太直接了

哈哈。不急啊,这要取决于当事人对不?我不会照抄代码的。我只是参考思路,代码要自己一个一个地敲出来才行。我会多向各位请教的!

使用特权

评论回复
20
zhangmangui| | 2013-1-30 10:09 | 只看该作者
jlass 发表于 2013-1-29 15:57
授人以鱼不如授人以渔,你太直接了

参考啊   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

27

帖子

0

粉丝