TI中文支持网
TI专业的中文技术问题搜集分享网站

如何用F28335的SCI接收中断接收140位字节的数据包?

打算用SCI接收GPS数据包例如$GPRMC,123532.00,A,3958.72889,N,11620.75493,E,0.000,,051216,,,A*76。但是fifo的深度只有16位,会溢出导致第一位数据丢失,所以打算用非fifo模式。

interrupt void scib_isr(void)
{
Uint16 regs;
if(ScibRegs.SCIRXST.bit.RXRDY==1) {
regs=ScibRegs.SCIRXBUF.all;
if(gpsnum<140)
{
tempgps[gpsnum]=regs;
gpsnum++;
}
}
if(gpsnum==140)
{
gpsnum=0;
}

PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;

}

中断函数如上,问题是每次接收完一遍都需要很久,而且经常出现乱码,请问应该怎么设置?

mangui zhang:

中断里面不建议处理   处理过程长   导致其他接收丢失

建议中断中只负责接收   存入  

然后交个主函数去处理

打算用SCI接收GPS数据包例如$GPRMC,123532.00,A,3958.72889,N,11620.75493,E,0.000,,051216,,,A*76。但是fifo的深度只有16位,会溢出导致第一位数据丢失,所以打算用非fifo模式。

interrupt void scib_isr(void)
{
Uint16 regs;
if(ScibRegs.SCIRXST.bit.RXRDY==1) {
regs=ScibRegs.SCIRXBUF.all;
if(gpsnum<140)
{
tempgps[gpsnum]=regs;
gpsnum++;
}
}
if(gpsnum==140)
{
gpsnum=0;
}

PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;

}

中断函数如上,问题是每次接收完一遍都需要很久,而且经常出现乱码,请问应该怎么设置?

js z:

回复 mangui zhang:

我的中断函数里只是把 接收的一个字符放在数组里,应该不复杂啊?不知道这样做可不可以,有没有可能是接收的数据太多?

打算用SCI接收GPS数据包例如$GPRMC,123532.00,A,3958.72889,N,11620.75493,E,0.000,,051216,,,A*76。但是fifo的深度只有16位,会溢出导致第一位数据丢失,所以打算用非fifo模式。

interrupt void scib_isr(void)
{
Uint16 regs;
if(ScibRegs.SCIRXST.bit.RXRDY==1) {
regs=ScibRegs.SCIRXBUF.all;
if(gpsnum<140)
{
tempgps[gpsnum]=regs;
gpsnum++;
}
}
if(gpsnum==140)
{
gpsnum=0;
}

PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;

}

中断函数如上,问题是每次接收完一遍都需要很久,而且经常出现乱码,请问应该怎么设置?

rookiecalf:

回复 js z:

其实不管是单个字节接收,还是使用FIFO都很方便,首选FIFO。乱码,接收不全,应该先查看波形的完好性,然后查看波特率能否匹配。另外,最好找到出现问题的地方是否有什么规律。

打算用SCI接收GPS数据包例如$GPRMC,123532.00,A,3958.72889,N,11620.75493,E,0.000,,051216,,,A*76。但是fifo的深度只有16位,会溢出导致第一位数据丢失,所以打算用非fifo模式。

interrupt void scib_isr(void)
{
Uint16 regs;
if(ScibRegs.SCIRXST.bit.RXRDY==1) {
regs=ScibRegs.SCIRXBUF.all;
if(gpsnum<140)
{
tempgps[gpsnum]=regs;
gpsnum++;
}
}
if(gpsnum==140)
{
gpsnum=0;
}

PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;

}

中断函数如上,问题是每次接收完一遍都需要很久,而且经常出现乱码,请问应该怎么设置?

js z:

回复 rookiecalf:

我需要接收的数据一帧超过了16个字符,用fifo有溢出错误。是不是只要超过16个字符的数据就不能用fifo了?

打算用SCI接收GPS数据包例如$GPRMC,123532.00,A,3958.72889,N,11620.75493,E,0.000,,051216,,,A*76。但是fifo的深度只有16位,会溢出导致第一位数据丢失,所以打算用非fifo模式。

interrupt void scib_isr(void)
{
Uint16 regs;
if(ScibRegs.SCIRXST.bit.RXRDY==1) {
regs=ScibRegs.SCIRXBUF.all;
if(gpsnum<140)
{
tempgps[gpsnum]=regs;
gpsnum++;
}
}
if(gpsnum==140)
{
gpsnum=0;
}

PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;

}

中断函数如上,问题是每次接收完一遍都需要很久,而且经常出现乱码,请问应该怎么设置?

rookiecalf:

回复 js z:

溢出之前(FIFO满时),把数据保存好就可以了啊

打算用SCI接收GPS数据包例如$GPRMC,123532.00,A,3958.72889,N,11620.75493,E,0.000,,051216,,,A*76。但是fifo的深度只有16位,会溢出导致第一位数据丢失,所以打算用非fifo模式。

interrupt void scib_isr(void)
{
Uint16 regs;
if(ScibRegs.SCIRXST.bit.RXRDY==1) {
regs=ScibRegs.SCIRXBUF.all;
if(gpsnum<140)
{
tempgps[gpsnum]=regs;
gpsnum++;
}
}
if(gpsnum==140)
{
gpsnum=0;
}

PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;

}

中断函数如上,问题是每次接收完一遍都需要很久,而且经常出现乱码,请问应该怎么设置?

js z:

回复 rookiecalf:

比如$GPRMC,123532.00,A,3958.72889,N,11620.75493,E,0.000,,051216,,,A*76这一串数据,每次中断fifo15个字符中的第一个字符就丢失了,导致没办法获得完整的数据。。。书上说超过15个数据,fifo的第一个字符就丢失,不知道怎么解决这个问题。

打算用SCI接收GPS数据包例如$GPRMC,123532.00,A,3958.72889,N,11620.75493,E,0.000,,051216,,,A*76。但是fifo的深度只有16位,会溢出导致第一位数据丢失,所以打算用非fifo模式。

interrupt void scib_isr(void)
{
Uint16 regs;
if(ScibRegs.SCIRXST.bit.RXRDY==1) {
regs=ScibRegs.SCIRXBUF.all;
if(gpsnum<140)
{
tempgps[gpsnum]=regs;
gpsnum++;
}
}
if(gpsnum==140)
{
gpsnum=0;
}

PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;

}

中断函数如上,问题是每次接收完一遍都需要很久,而且经常出现乱码,请问应该怎么设置?

rookiecalf:

回复 js z:

js z

比如$GPRMC,123532.00,A,3958.72889,N,11620.75493,E,0.000,,051216,,,A*76这一串数据,每次中断fifo15个字符中的第一个字符就丢失了,导致没办法获得完整的数据。。。书上说超过15个数据,fifo的第一个字符就丢失,不知道怎么解决这个问题。

打算用SCI接收GPS数据包例如$GPRMC,123532.00,A,3958.72889,N,11620.75493,E,0.000,,051216,,,A*76。但是fifo的深度只有16位,会溢出导致第一位数据丢失,所以打算用非fifo模式。

interrupt void scib_isr(void)
{
Uint16 regs;
if(ScibRegs.SCIRXST.bit.RXRDY==1) {
regs=ScibRegs.SCIRXBUF.all;
if(gpsnum<140)
{
tempgps[gpsnum]=regs;
gpsnum++;
}
}
if(gpsnum==140)
{
gpsnum=0;
}

PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;

}

中断函数如上,问题是每次接收完一遍都需要很久,而且经常出现乱码,请问应该怎么设置?

js z:

回复 rookiecalf:

fifo是十六级深度,但是如果一个帧的数据超过16就会溢出,所以我发送的那一串就会溢出,导致每个中断的fifo的第一个字符丢失,最后的现象就是这一串数据每隔16个字符就会有一个字符丢失。试了好多次都是这个结果,如果一帧少于16个数就没问题。

打算用SCI接收GPS数据包例如$GPRMC,123532.00,A,3958.72889,N,11620.75493,E,0.000,,051216,,,A*76。但是fifo的深度只有16位,会溢出导致第一位数据丢失,所以打算用非fifo模式。

interrupt void scib_isr(void)
{
Uint16 regs;
if(ScibRegs.SCIRXST.bit.RXRDY==1) {
regs=ScibRegs.SCIRXBUF.all;
if(gpsnum<140)
{
tempgps[gpsnum]=regs;
gpsnum++;
}
}
if(gpsnum==140)
{
gpsnum=0;
}

PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;

}

中断函数如上,问题是每次接收完一遍都需要很久,而且经常出现乱码,请问应该怎么设置?

rookiecalf:

回复 js z:

出现这个问题的原因是你没有及时将数据取出保存。

打算用SCI接收GPS数据包例如$GPRMC,123532.00,A,3958.72889,N,11620.75493,E,0.000,,051216,,,A*76。但是fifo的深度只有16位,会溢出导致第一位数据丢失,所以打算用非fifo模式。

interrupt void scib_isr(void)
{
Uint16 regs;
if(ScibRegs.SCIRXST.bit.RXRDY==1) {
regs=ScibRegs.SCIRXBUF.all;
if(gpsnum<140)
{
tempgps[gpsnum]=regs;
gpsnum++;
}
}
if(gpsnum==140)
{
gpsnum=0;
}

PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;

}

中断函数如上,问题是每次接收完一遍都需要很久,而且经常出现乱码,请问应该怎么设置?

js z:

回复 rookiecalf:

我就是把接收到的数据放在一个字符型数组里了,然后观察的是这个数组,不知道应该怎么取出保存,网上关于这个的也没找到

赞(0)
未经允许不得转载:TI中文支持网 » 如何用F28335的SCI接收中断接收140位字节的数据包?
分享到: 更多 (0)