⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 232tocan.lst

📁 RS232/CAN转换器 硬件电路需自己设计(电路很简单)
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V8.17   232TOCAN                                                              03/22/2009 15:12:45 PAGE 21  

1233   3              }
1234   2              Command[4] = 'H';
1235   2              Command[5] = '\0';
1236   2              Send_stream(Command);
1237   2              
1238   2              Send_end();
1239   2              
1240   2              Send_stream("Acceptance Mask:");
1241   2              Command[0] =  Amr_data / 4096;
1242   2              Command[1] = (Amr_data % 4096) / 256;
1243   2              Command[2] = (Amr_data % 256) / 16;
1244   2              Command[3] =  Amr_data % 16;
1245   2              
1246   2              for (t_c = 0; t_c < 4; t_c++)
1247   2              {
1248   3                  Hex_to_ascii(&Command[t_c]);
1249   3              }
1250   2              Command[4] = 'H';
1251   2              Command[5] = '\0';
1252   2              Send_stream(Command);
1253   2              
1254   2              Send_end();
1255   2              
1256   2              Recjs = 0;
1257   2              
1258   2              //接收命令
1259   2              while (1)
1260   2              {
1261   3                  Dog();
1262   3                  
1263   3                  if (_testbit_(RI))
1264   3                  {
1265   4                      REC_LED = 0;
1266   4                      t_c = SBUF;
1267   4                      
1268   4                      if (Recjs < CMD_LENGHT)
1269   4                      {
1270   5                          Command[Recjs++] = t_c;
1271   5                  
1272   5                          //是否有换行符
1273   5                          if (t_c == ASCII_LF && Recjs > 1)
1274   5                          {
1275   6                              //前面一个字符是否为回车符
1276   6                              if (Command[Recjs - 2] == ASCII_ENTER)
1277   6                              {
1278   7                                  if (Perform_cmd() > 0)
1279   7                                  {
1280   8                                      //退出调试状态
1281   8                                      break;
1282   8                                  }
1283   7                              }
1284   6                              Recjs = 0;
1285   6                          }
1286   5                      }
1287   4                      else
1288   4                      {
1289   5                          Recjs = 0;
1290   5                      }
1291   4                  }  
1292   3              }
1293   2          }
1294   1          
C51 COMPILER V8.17   232TOCAN                                                              03/22/2009 15:12:45 PAGE 22  

1295   1          ES = 1;
1296   1      }
1297          //CAN发送程序
1298          void Can_send_data(void)
1299          {
1300   1          union
1301   1          {
1302   1              uchar t[2];
1303   1              uint cc;
1304   1          }var;
1305   1          
1306   1          uchar length;
1307   1          //uchar length1;
1308   1          //uchar length2;
1309   1          uchar t_a;
1310   1          uchar t_b;
1311   1          
1312   1          //是否需要启动CAN发送数据
1313   1          if (!Can_send_ready)
1314   1          {
1315   2              return;
1316   2          }
1317   1          
1318   1          //当前串口接收字节长度是否在约定范围内
1319   1          if (Com_rxcount < COM_MIN)
1320   1          {
1321   2              //释放串口接收缓冲区
1322   2              Com_rxcount = 0;
1323   2              Can_send_ready = 0;
1324   2              return;
1325   2          }
1326   1          
1327   1          //对串口数据进行判断
1328   1          if (Com_rxbuf[0] == COM_HEAD && Com_rxbuf[Com_rxcount - 1] == COM_END)
1329   1          {
1330   2              var.cc = 0;
1331   2              length = Com_rxcount - 3;
1332   2              
1333   2              //统计累加和
1334   2              for (t_a = 1; t_a < length; t_a++)
1335   2              {
1336   3                  var.cc += Com_rxbuf[t_a];
1337   3              }
1338   2              
1339   2              //累加和是否相等
1340   2              if (var.t[0] != Com_rxbuf[t_a] || var.t[1] != Com_rxbuf[t_a + 1])
1341   2              {
1342   3                  //释放串口接收缓冲区
1343   3                  Com_rxcount = 0;
1344   3                  Can_send_ready = 0;
1345   3                  return;
1346   3              }
1347   2          }
1348   1          //串口接收数据有误
1349   1          else
1350   1          {
1351   2              //释放串口接收缓冲区
1352   2              Com_rxcount = 0;
1353   2              Can_send_ready = 0;
1354   2              return;
1355   2          }
1356   1          
C51 COMPILER V8.17   232TOCAN                                                              03/22/2009 15:12:45 PAGE 23  

1357   1          //串口接收缓冲区数据转移到CAN发送缓冲区
1358   1          Can_txcount = Com_rxcount;
1359   1          
1360   1          for (t_a = 0; t_a < Can_txcount; t_a++)
1361   1          {
1362   2              Can_txbuf[t_a] = Com_rxbuf[t_a];
1363   2          }
1364   1          //释放串口接收缓冲区
1365   1          Com_rxcount = 0;
1366   1          Can_send_ready = 0;
1367   1          
1368   1          //BasicCAN      
1369   1          if (Can_mode == 0)
1370   1          {
1371   2              /*
1372   2              //至少两个字节
1373   2              if (Can_txcount > 1)
1374   2              {
1375   2                  //是否为远程帧
1376   2                  if ((Can_txbuf[1] & 0x10) > 0)
1377   2                  {
1378   2                      t_b = 0;
1379   2                      //无发送
1380   2                      while ((BASIC_STATUS_REG & 0x20) > 0)
1381   2                      {
1382   2                          Somenop();
1383   2                          //超时处理
1384   2                          if (++t_b == 255)
1385   2                          {
1386   2                              Can_err = 1;
1387   2                              return;        
1388   2                          }
1389   2                      }
1390   2                  
1391   2                      BASIC_TX_ID1 = Can_txbuf[0];
1392   2                      BASIC_TX_ID2 = Can_txbuf[1];
1393   2                  
1394   2                      //发送请求
1395   2                      BASIC_COMMAND_REG = TR_CMD;
1396   2                      //PELI_COMMAND_REG = SRR_CMD;
1397   2                  
1398   2                      t_b = 0;
1399   2                      //发送是否完毕
1400   2                      while ((BASIC_STATUS_REG & 0x0c) != 0x0c)
1401   2                      {
1402   2                          Somenop();
1403   2                          //超时处理
1404   2                          if (++t_b == 255)
1405   2                          {
1406   2                              Can_err = 1;
1407   2                              return;        
1408   2                          }
1409   2                      }
1410   2                      SEND_LED = 0;
1411   2                  }
1412   2                  else
1413   2                  {
1414   2                      //数据总长度
1415   2                      length = Can_txcount - 2;
1416   2                      length1 = length / 8;
1417   2                      length2 = length % 8;
1418   2                      //数据区起始位置
C51 COMPILER V8.17   232TOCAN                                                              03/22/2009 15:12:45 PAGE 24  

1419   2                      length = 2;
1420   2                      
1421   2                      //8的整倍数
1422   2                      if (length1 > 0)
1423   2                      {
1424   2                          for (t_a = 0; t_a < length1; t_a++)
1425   2                          {
1426   2                              t_b = 0;
1427   2                              //无发送
1428   2                              while ((BASIC_STATUS_REG & 0x20) > 0)
1429   2                              {
1430   2                                  Somenop();
1431   2                                  //超时处理
1432   2                                  if (++t_b == 255)
1433   2                                  {
1434   2                                      Can_err = 1;
1435   2                                      return;        
1436   2                                  }
1437   2                              }
1438   2                              
1439   2                              BASIC_TX_ID1 = Can_txbuf[0];
1440   2                              BASIC_TX_ID2 = (Can_txbuf[1] & 0xf0) | 0x08;
1441   2                              
1442   2                              for (t_b = 0; t_b < 8; t_b++)
1443   2                              {
1444   2                                  PBYTE[12 + t_b] = Can_txbuf[length++];
1445   2                              }
1446   2                              
1447   2                              //发送请求
1448   2                              BASIC_COMMAND_REG = TR_CMD;
1449   2                              //PELI_COMMAND_REG = SRR_CMD;
1450   2                              
1451   2                              t_b = 0;
1452   2                              //发送是否完毕
1453   2                              while ((BASIC_STATUS_REG & 0x0c) != 0x0c)
1454   2                              {
1455   2                                  Somenop();
1456   2                                  //超时处理
1457   2                                  if (++t_b == 255)
1458   2                                  {
1459   2                                      Can_err = 1;
1460   2                                      return;        
1461   2                                  }
1462   2                              }
1463   2                              SEND_LED = 0;
1464   2                          }
1465   2                      }
1466   2                      
1467   2                      //小于8
1468   2                      if (length2 > 0)
1469   2                      {                                  
1470   2                          t_b = 0;
1471   2                          //无发送
1472   2                          while ((BASIC_STATUS_REG & 0x20) > 0)
1473   2                          {
1474   2                              Somenop();
1475   2                              //超时处理
1476   2                              if (++t_b == 255)
1477   2                              {
1478   2                                  Can_err = 1;
1479   2                                  return;        
1480   2                              }
C51 COMPILER V8.17   232TOCAN                                                              03/22/2009 15:12:45 PAGE 25  

1481   2                          }
1482   2                              
1483   2                          BASIC_TX_ID1 = Can_txbuf[0];
1484   2                          BASIC_TX_ID2 = (Can_txbuf[1] & 0xf0) | length2;
1485   2                              
1486   2                          for (t_b = 0; t_b < length2; t_b++)
1487   2                          {
1488   2                              PBYTE[12 + t_b] = Can_txbuf[length++];
1489   2                          }
1490   2                              
1491   2                          //发送请求
1492   2                          BASIC_COMMAND_REG = TR_CMD;
1493   2                          //PELI_COMMAND_REG = SRR_CMD;
1494   2                              
1495   2                          t_b = 0;
1496   2                          //发送是否完毕
1497   2                          while ((BASIC_STATUS_REG & 0x0c) != 0x0c)
1498   2                          {
1499   2                              Somenop();
1500   2                              //超时处理
1501   2                              if (++t_b == 255)
1502   2                              {
1503   2                                  Can_err = 1;
1504   2                                  return;        
1505   2                              }
1506   2                          }
1507   2                          SEND_LED = 0;                    
1508   2                      }
1509   2                  }
1510   2              }
1511   2              */
1512   2          }
1513   1          //PeliCAN
1514   1          else
1515   1          {
1516   2              //标准帧
1517   2              if ((Can_txbuf[1] & 0x80) == 0)
1518   2              {
1519   3                  //是否为远程帧
1520   3                  if ((Can_txbuf[1] & 0x40) > 0)
1521   3                  {
1522   4                      t_b = 0;
1523   4                      //无接收、发送
1524   4                      while ((PELI_STATUS_REG & 0x30) > 0)
1525   4                      {
1526   5                          Somenop();
1527   5                          //超时处理
1528   5                          if (++t_b == 255)
1529   5                          {
1530   6                              Can_err = 1;
1531   6                              return;        
1532   6                          }
1533   5                      }  
1534   4                          
1535   4                      TX_FRAME_INFO = Can_txbuf[1]; 
1536   4                      
1537   4                      var.t[0] = Can_txbuf[2];
1538   4                      var.t[1] = Can_txbuf[3];
1539   4                      var.cc <<= 5;
1540   4   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -