打印

求一个PIC18F452串口连续发送数据的例子

[复制链接]
6557|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sinc_mark|  楼主 | 2013-3-27 20:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求一个PIC18F452串口连续发送数据的例子,不知道怎么可以连续的发送一组不固定长度的数据,谢谢!
沙发
sinc_mark|  楼主 | 2013-3-27 20:39 | 只看该作者
进入中断处理后,不知道可以怎么发送下一个字节的数据了,请给些建议,谢谢!

使用特权

评论回复
板凳
yklstudent| | 2013-3-27 20:47 | 只看该作者
不会用中断发送  就用查询的发送好了

使用特权

评论回复
地板
yewuyi| | 2013-3-28 08:49 | 只看该作者
你所有的相关的寄存器都设置正确的话,你进入中断函数后直接向发送缓冲寄存器送待发数据即可。

当数据包长度不固定时,一般要求在数据帧中增加一个数据包的字节长度值,接受方根据这个长度值来确定自己应该连续接受多长字节的数据包,当然这个字节长度数值也不可能是无限大的,一般要有一个最大值限制,如果这个长度值定义为一个字节的话,那就是最长255个字节了啊。

使用特权

评论回复
5
sinc_mark|  楼主 | 2013-3-28 13:30 | 只看该作者
1521732588 发表于 2013-3-28 10:00
到官网上看看有没有www.microchip.com

刚刚上官网去找了,但不知道应该怎么找,呵呵!

使用特权

评论回复
6
sinc_mark|  楼主 | 2013-3-28 15:09 | 只看该作者
yewuyi 发表于 2013-3-28 08:49
你所有的相关的寄存器都设置正确的话,你进入中断函数后直接向发送缓冲寄存器送待发数据即可。

当数据包长 ...

请教版主,这是我按你的提示做的:
oid UartInit(void)//初始化函数
{

//        INTCONbits.GIE = 0;                         //清零总中断
//        PIE1bits.TXIE = 0;                                //清零发送中断
//        PIE1bits.RCIE = 0;                                //清除接收中断

        TXSTAbits.BRGH = 1;                          //选择高速模式
        TXSTAbits.SYNC= 0;                                //选择异步模式
//         RCSTAbits.SPEN = 0;                                //清除串口使能位
        SPBRG = 162;                                           //波特率设定:25M,异步,高速,9600,查表的值
        RCSTAbits.SPEN = 1;                                //使能串口发送

        TRISCbits.TRISC7 = 1;                //将
        TRISCbits.TRISC6 = 0;
        TXSTAbits.TXEN = 0;                        //允许发送使能
    RCSTAbits.CREN = 0;                        //接收使能:暂时不开启串口接收功能
        PIE1bits.TXIE = 1;                        //发送中断使能位:使能发送中断
//        PIR1bits.TXIF = 0;                        //清零发送中断
       
        PIE1bits.RCIE = 0;                        //接收中断使能位:暂时关闭接收中断
        IPR1bits.RCIP = 0;                        //接收中断优先级:低
        IPR1bits.TXIP = 0;                        //发送中断优先级:低
        RCONbits.IPEN = 1;                        //中断优先级使能位:使能优先级中断
        INTCONbits.PEIE = 1;                //使能外设中断
        INTCONbits.GIEH = 1;                //使能总中断
        INTCONbits.GIEL = 1;                //使能外设中断
}
当我发送SendToPrin(tmp,3);时
void SendToPrin(uchar* sentdata,uchar totalSend)
{
        uchar         i;
        uchar  utSendIndex = 0;

        sendpoint = sentdata;
        sentlen = totalSend;        //记录需要发送的长度
        TXREG = *sendpoint;                //发送第一个字节
        TXSTAbits.TXEN = 1;         //使能发送中断
}       
中断处理:
void low_isr(void)
{

        if (PIR1bits.TXIF == 1)
        {
                if (sentcnt > sentlen)  //send all data
                {
                          sentlen= 0;
                        sentcnt = 0;
                        sendpoint = 0;
                        TXSTAbits.TXEN = 0;
                        PIR1bits.TXIF = 0;
                          return;
                }
                else
                {
                        sentcnt++;
                        TXREG = *sendpoint++;
                       
                }
         
        }

}
现在的情况是,我间隔0.5S,发送一次SendToPrin(tmp,3);
但串口接收端显示不断的收到数据

使用特权

评论回复
7
yewuyi| | 2013-3-28 17:03 | 只看该作者
1、我只能提示解决问题的方法
2、让我给你详细的阅读代码并一条条的抓虫子,显然这是个苦力活,还是要靠自己,别人没有那么精力。
3、要学会DEBUG的一些基本手段,否则就尽量从最简单的代码一点点练习熟练后再动手。

使用特权

评论回复
8
sinc_mark|  楼主 | 2013-3-29 11:14 | 只看该作者
是我的max232芯片异常导致发送异常,现已解决!

使用特权

评论回复
9
chu888| | 2013-3-30 13:37 | 只看该作者
那就好啊,但感觉,还是程序有问题

使用特权

评论回复
10
sinc_mark|  楼主 | 2013-3-31 16:42 | 只看该作者
chu888 发表于 2013-3-30 13:37
那就好啊,但感觉,还是程序有问题

呵呵,让你说对了,程序还是有问题,现在的问题是:用我的中断串口发送函数,发送一个固定长度的数据,开始的几次是正确的,后面就出错了,因为我的串口中断发送函数就只有两个参数:一个是指向要发送的数组的指针,另外一个是要发送的长度。现在出现的问题是,在正确发送几帧后,数据出错了,但长度没变化,我的感觉是指针异常了,不知道是哪里导致的,以前用16F的时候还未出现过这样的情况,不知道是不是因为我没有设定代码保护导致的,现在在郁闷中,兄台可有遇到过类似的情况否?

使用特权

评论回复
11
shanbinaa| | 2013-4-12 14:42 | 只看该作者
sinc_mark 发表于 2013-3-31 16:42
呵呵,让你说对了,程序还是有问题,现在的问题是:用我的中断串口发送函数,发送一个固定长度的数据,开 ...

长度正确,数据错误。我遇到过这个问题。用的PIC18F46K80.串口二每次收到的数据总是串口一收到数据的最后一个字节,但长度没有错。当时查到的原因可能是定时器1配置有关。然后配了两天还是没配出来就回档用了别的定时器。

使用特权

评论回复
12
sinc_mark|  楼主 | 2013-4-15 09:05 | 只看该作者
shanbinaa 发表于 2013-4-12 14:42
长度正确,数据错误。我遇到过这个问题。用的PIC18F46K80.串口二每次收到的数据总是串口一收到数据的最后 ...

我没有打开定时器1.只有用到了定时器0,调了几天,最终也不知道怎么回事,现在用回pic16f算了,现在都不明白,按道理说,18系列的要比16系列高级才对,不知道是我设置哪里出错了,导致这个问题。

使用特权

评论回复
13
carverzhang| | 2016-2-18 15:51 | 只看该作者
路过看看,貌似我用的 PIC18F67K22也遇到这个问题了

使用特权

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

本版积分规则

个人签名:教育,就是把娃围起来,一期一期的收钱。 医疗,就是把命围起来,一天一天的收钱。

47

主题

301

帖子

0

粉丝