#1楼主:参考PIAE 例程 CAN RS232 同时使用时的问题
文章发表于:2008-06-29 12:12
太感激彩云及PIAE了,本坛提供的学习板及程序例子把我带入门了,因有C的基础,所以很容易入门了, 现在本人急切需求想做一个实用一点的系统 用于生产线上的零 件条码收集,所收集后的数据通过RS232口提交给PC ,留作MRP系统的基础数据,
感谢PIAE提供的例程非常实用, 我现时已实现了 条码阅读机--->RS232 -->单片机 ---CAN(节点一)-------------------------> CAN(节点二) ---->单片机 232 --->电脑
已初步通过, PC端的程序用DELPHI 编写.
但在调试节点一的程序时发现一个问题,就是 can 的发送函数一用上时(Txd_deal(void) ) 会对232的发送有影响 ,会中断RS232的的信号收集 ,即8位的条码,只会发送4位的条码 .
PIAE 及各位DX能帮忙解决问题吗?不胜感激!
#2
文章发表于:2008-06-29 00:21
void Txd_deal(void)
{//发送处理函数,主要是准备数据,并且调用发送函数
if( TXD_flag == 1 )
{
_nop_();
TXD_flag = 0;
TX_buffer[5] = Txd_data;//
CAN_TXD();
_nop_();
_nop_();
}
}
void main(void)
{
//CPU初始化
SJA_RST = 1;//CAN总线复位管脚
SJA_CS = 0;//CAN总线片选有效
EX1 = 1;
IT1 = 0;//CAN总线接收中断
IT0 = 1;//外部中断0负边沿触发
EX0 = 1;//打开外部中断0
EA = 1; //打开总中断
SJA_CS = 1;//CAN总线片选无效,保证数据线上的变化不会影响SJA1000
//CPU初始化
CAN_init( );
_nop_();
_nop_();
CPU_init();
_nop_();
while(1)
{
NOPS;
//////////////////////// 接收处理程序/////////////////////////////////
if( RXD_flag )
{
EA = 0;//关闭CPU中断
LED_RED = !LED_RED;//指示灯状态变化
RXD_flag = 0;//清除标志
//下面的是本人更改的部份 只是把RS232接收的数据传给 CAN 发送出去
TXD_flag =1 ;
Rxd_data =RX_data ;
Txd_deal();//发送处理程序
EA = 1;
}
///////////////////////数码管显示程序/////////////////////////////////
led_seg7(1,Show_TX_Data);
led_seg7(3,Show_RX_Data);
///////////////////////数码管显示程序/////////////////////////////////
}//while 结束
}//main结束
#3
文章发表于:2008-06-29 00:30
并在RS232 接收函数上加上计数变量 Count_232
void RS232_RXD( void ) interrupt 4 using 1
{//接收数据函数,在中断服务程序中调用
EA = 0;//关闭所有中断
ES = 0;//关闭串口
if(RI==1)
{
RI = 0;
RX_data = SBUF;
RXD_flag = 1;//置接收到数据标志
Count_232++;
}
_nop_();
ES = 1;//打开串口
并在Main 函数加上显示 RS232 接收数据的长度
led_seg7(3,Count_232);
很奇怪的是 原先从RS232 从传递的数据变短了,原先8位的字串只接收到4位,
把 Main 函数里的 Txd_deal();//发送处理程序 删除后 就正常了。
各位DX ,能告之解决办法吗 ,不胜感激!
#4
文章发表于:2008-06-30 10:39
PIAE 兄,能告之我原因吗 ,最后找到 CAN发送函数中去,把 CMR = 0x01删除后RS232的接收就正常了,但CAN信号就没有发送出去 ,因为CMR是发送标志,不能去除的 , 因对C51 及CAN 的基础知识还不熟悉 ,是否CAN总线的初始设定问题,把接收或发送的长度给限制了,求各位指点......
急死了!
void CAN_TXD( void )
{
uchar data Judge;
uchar data TX_buffer[ N_can ] ;
..................................
.................................
// 把如下语句删除后 ,RS232的接收变正常了
CMR = 0x01;
EA = 1;
}
#5
文章发表于:2008-06-30 12:22
最近比较忙,没有仔细看你的程序,但是从你的描述来看,can的中断是不是和串口的中断冲突呢?你安排一下中断的调用,看看能不能解决问题
#6
文章发表于:2008-07-01 08:59
piae兄,谢谢你的回复, 程式是按你提供的例程,很少改动
RS232接收数据的中断设定是:
void RS232_RXD( void ) interrupt 4 using 1
CAN接收数据的中设定是:
void CAN_RXD( void ) interrupt 2
Rs232 的发送及CAN的发送没用到中断。
我看不到有冲突的地方,是否条码机的读数据方式与本程式的模式不配合:
条码机是一次过把几个到十几个字符一同传送到单片机上,但单片机每从RS232口接收一个字符就引起中断 并 调用CAN再发送 ,但PIAE提供的例程是从按键每按一下就触发一次发送,但条码机从RS232口一次有一堆数据发送,不知这样用同样程式结构能否处理 ,不知道这是不是产生问题的原因。
#7
文章发表于:2008-07-01 14:58
CAN总线一包数据可以发送8个字节,你可以收到8个字节的串口数据启动一次CAN发送程序!
#8
文章发表于:2008-07-02 16:53
谢谢PIAE的指点 ,程式改成 "CAN总线一包数据发送8个字节的方式" 改程序 ,问题就解决了 , 原因是当RS232 读数据较多时 ,若有其它程式执行占太多时间的话 ,会影响RS232口数据的读取。
#9
文章发表于:2008-09-11 19:52
LZ,能提供点资料么
#10
文章发表于:2008-09-18 22:03
我以为,楼主在
//////////////////////// 接收处理程序/////////////////////////////////
if( RXD_flag )
{ ...}
里面关中断就意味着有丢数据的风险