您现在所在的是:

串口通信

回帖:16个,阅读:5226 [上一页] [1] [2] [下一页]
468
18362893419
文章数:7
年度积分:50
历史总积分:468
注册时间:2016/9/26
发站内信
发表于:2016/10/2 11:03:18
#10楼
回复 #8楼 hj2881
对  自有协议,但你需要要编写发送和接受指令,里面用到了crc校验程序,不是很会编写
468
18362893419
文章数:7
年度积分:50
历史总积分:468
注册时间:2016/9/26
发站内信
发表于:2016/10/2 11:04:02
#11楼
回复 #1楼 hnhyczj
有事例没编程
468
18362893419
文章数:7
年度积分:50
历史总积分:468
注册时间:2016/9/26
发站内信
发表于:2016/10/2 11:05:05
#12楼
回复 #4楼 2232923848
用触摸屏通过驱动器控制电机正反转
27950
guanyumou 版主
文章数:10552
年度积分:1133
历史总积分:27950
注册时间:2008/7/13
发站内信
2018论坛优秀版主
2018春节活动(三)
2017论坛优秀版主
2017国庆活动(二)
2017春节活动(三)
发表于:2016/10/12 18:26:44
#13楼
以下是引用183628934192016/10/2 11:05:05的发言:
用触摸屏通过驱动器控制电机正反转
你的问题还没有解决吗?!
基于各种组态软件\触摸屏\PLC\单片机\变频器Modbus TCP\RTU\ASCII通信编程服务,需要请直接
联系!腾讯扣扣149034219
1030
lmc4791
文章数:25
年度积分:50
历史总积分:1030
注册时间:2009/8/18
发站内信
发表于:2016/10/20 20:05:03
#14楼
我做过威纶和STM32单片机通信,威纶PLC直接选择MODBUS RTU就可以了。
1119
hj2881
文章数:26
年度积分:50
历史总积分:1119
注册时间:2015/10/29
发站内信
发表于:2016/10/29 11:19:29
#15楼
回复 #10楼 18362893419
crc指令宏指令那里可以直接调用的  不麻烦  话说都这么久了应该已经解决了吧~~~
1030
lmc4791
文章数:25
年度积分:50
历史总积分:1030
注册时间:2009/8/18
发站内信
发表于:2020/7/16 19:38:54
#16楼
//串口初始化9600,8,N,1
void uart_init(u32 pclk2,u32 bound)
{  
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);
mantissa=temp;
fraction=(temp-mantissa)*16;
   mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2;
RCC->APB2ENR|=1<<14;
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0X000008B0;
RCC->APB2RSTR|=1<<14;
RCC->APB2RSTR&=~(1<<14);  
USART1->BRR=mantissa;
USART1->CR1|=0X200C;

USART1->CR1|=1<<8;
USART1->CR1|=1<<5;      
MY_NVIC_Init(3,3,USART1_IRQn,2);

}

void init_time3(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;
TIM3->ARR=arr;  //éè?¨??êy?÷×??ˉ??×°?μ//??o?1ms
TIM3->PSC=psc;  //?¤·??μ?÷72,μ?μ?1Mhzμ???êyê±?ó
 TIM3->CR1|=1<<4;    //?ò????êy
TIM3->DIER|=1<<0;  
TIM3->DIER|=1<<6;
MY_NVIC_Init(1,3,TIM3_IRQn,2);//?à??1£?×óó??è??3£?×é2

}
void beginSend(u8* sendPosi,u8 sendCount)
{
//IO1CLR=q2;
TX_EN; //éè?a·¢?í
while(sendCount>0)
{
sendCount--;
USART1_TX(*(sendPosi++));
}
RX_EN;
receCount=0;
}
void readRegisters(void )
{
u8 sendCount;
u16 tempAddr;
u16 crcData;
u16 byteCount;
u8 i;
tempAddr=(receBuf[2]<<8|receBuf[3])*2;
byteCount=(receBuf[4]<<8|receBuf[5])* 2;
sendBuf[0] = localAddr;
sendBuf[1] = 3;
sendBuf[2] = (u8)byteCount;
for(i=0;i<byteCount;i++,tempAddr++)
{
sendBuf[i+3] = syscanshu[tempAddr];  
}
byteCount += 3;
crcData = crc16(sendBuf,byteCount);
sendBuf[byteCount] = crcData >> 8;
byteCount++;
sendBuf[byteCount] = crcData & 0xff;
sendCount = byteCount + 1;
beginSend(sendBuf,sendCount);                                   //
}
void presetMultipleRegisters(void)
{
u8 sendCount;
u16 tempAddr;
u8 byteCount;
u16 crcData;
u8 i;

tempAddr = (receBuf[2]<<8|receBuf[3])*2;//ìáè???′??÷??êy

sendBuf[0] = localAddr;
sendBuf[1] = 16;
sendBuf[2] = receBuf[2];
sendBuf[3] = receBuf[3];
sendBuf[4] = receBuf[4];
sendBuf[5] = receBuf[5];
byteCount =  receBuf[6];
for(i=0;i<byteCount;i++,tempAddr++)
{
syscanshu[tempAddr]=receBuf[i+7];
}
crcData = crc16(sendBuf,6);
sendBuf[6] = crcData >> 8;
sendBuf[7] = crcData & 0xff;
sendCount = 8;
beginSend(sendBuf,sendCount);
}
/*******************************************************
*  ??    3?£osetRegisterVal()
*  1|    ?ü£oéè??μ¥????′??÷
*  è??ú2?êy£o?T
*  3??ú2?êy£o?T
********************************************************/
void setRegisterVal(void)
{
u8 sendCount;
u16 tempAddr;
u16 crcData;

tempAddr = (receBuf[2]<<8|receBuf[3])*2;

syscanshu[tempAddr]=receBuf[4];
syscanshu[tempAddr+1]=receBuf[5];

sendBuf[0] = localAddr;
sendBuf[1] = 6;
sendBuf[2] = receBuf[2];
sendBuf[3] = receBuf[3];
sendBuf[4] = receBuf[4];
sendBuf[5] = receBuf[5];
crcData = crc16(sendBuf,6);
sendBuf[6] = crcData >> 8;
sendBuf[7] = crcData & 0xff;
sendCount = 8;
beginSend(sendBuf,sendCount);
}
/*******************************************************
*  ??    3?£ocheckComm0Modbus()
*  1|    ?ü£o?ì2a′??úêy?Y
*  è??ú2?êy£o?T
*  3??ú2?êy£o?T
********************************************************/
void checkComm0Modbus(void)
{
u16 crcData;
u16 tempData;
if(receBuf[0]==localAddr)
{
if(receBuf[1]==3||receBuf[1]==6)
{
crcData = crc16(receBuf,6);
 if(crcData == receBuf[7]+(receBuf[6]<<8))
 {//D£?é?yè·
  switch(receBuf[1])
  {
  case 3:LED3=0;readRegisters();break;//?áè?±£3???′??÷(ò????ò?à??)//?áè?±£3???′??÷(ò????ò?à??)
      case 6:LED3=1;setRegisterVal();break;//éè??μ¥????′??÷
}
 }
}
if(receBuf[1]==16)
{
tempData = (receBuf[4]<<8) + receBuf[5];
tempData = tempData * 2; //êy?Y??êy
tempData += 9;
if(receCount >= tempData)
{// IO1CLR=q2;
crcData = crc16(receBuf,tempData-2);
if(crcData == (receBuf[tempData-2]<<8)+ receBuf[tempData-1])
{

presetMultipleRegisters();
}

}

 }

 }
}

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

78.0005