打印
[STM32F1]

stm32求助

[复制链接]
5376|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
张鋆|  楼主 | 2014-9-4 18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人想写一个stm32与组态王通讯的程序。在网上找了一些资料。里边有一块一直调试不通,请教一下大家。还有就是单片机作为从机地址怎么设置,还有数据地址怎么设置?
uchar AsciiToHex(uchar *StartAdd,uchar n)
{
uchar i,d;
    for(i=0;i<n;i++)
  {
d<<=4;
    if(StartAdd>0x40) d=d+(StartAdd-0x37);
    else d=d+(StartAdd-0x30);
}
    return (d);
}

1)、stm32串口配置
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStructure;
USART_InitStructure.USART_BaudRate=115200;//波特率115200 USART_InitStructure.USART_WordLength=USART_WordLength_8b;  //8位传输 USART_InitStructure.USART_StopBits=USART_StopBits_1;//1个停止位
USART_InitStructure.USART_Parity=USART_Parity_No;//无校验位
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //RX|TX模式
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//禁止硬件流控,禁止RTS,CTS信号 USART_Init(USART1,&USART_InitStructure);
/*USART1时钟配置*/
USART_ClockInitStructure.USART_Clock=USART_Clock_Disable;//禁止串口时钟
USART_ClockInitStructure.USART_CPOL=USART_CPOL_Low;
USART_ClockInitStructure.USART_CPHA=USART_CPHA_2Edge;
USART_ClockInitStructure.USART_LastBit=USART_LastBit_Disable;
USART_ClockInit(USART1,&USART_ClockInitStructure);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使USART1接收中断
USART_ClearFlag(USART1,USART_FLAG_TC);//一个一个字节发送时使用USART_FLAG_TXE,连续发送时用USART_FLAG_TC
USART_Cmd(USART1,ENABLE);
}
2)、stm32串口中断程序
void USART1_IRQHandler(void)
{
  uchar buf;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
    buf=(uchar)USART_ReceiveData(USART1);//读数据
    if(RecFlag)
  {
if(buf==0x0d)//判断接收完成
{
RecOK=1;
    RecFlag=0;
}
    else
  {
RecBuf[RecCount]=buf;
    RecCount++;
}
}
if(buf==0x40) //判断接收字头
RecFlag=1;
}
   USART_ClearFlag(USART1,USART_FLAG_RXNE);
   USART_ClearITPendingBit(USART1,USART_FLAG_RXNE);
}
3、接收数据的CRC校验程序
/***********ASCII码转换成16进制数***********/
uchar AsciiToHex(uchar *StartAdd,uchar n)
{
uchar i,d;
    for(i=0;i<n;i++)
  {
d<<=4;
    if(StartAdd>0x40) d=d+(StartAdd-0x37);
    else d=d+(StartAdd-0x30);
}
    return (d);
}
/**********校验接收到的数据帧的CRC校验码********/
char ChackCRC(void)
{
uchar i,xordat,crc;
crc=AsciiToHex(&RecBuf[RecCount-2],2);
for(i=0,xordat=0;i<RecCount-2;i++)
xordat^=RecBuf;
RecCount=0;
if(crc==xordat) return 1;
else return 0;
}
4、下位机读写函数
/********下位机读函数********/
void ReadData(void)
{ uchar i,crc;
TBUF[0]=0x40;
TBUF[1]=RecBuf[0];
TBUF[2]=RecBuf[1];
TBUF[3]=RecBuf[8];
TBUF[4]=RecBuf[9];
for(i=ByteCount*2;i>0;i--)
{
if(ByteCount>1)
TBUF[ByteCount*2-i+5]=ASCII[(word[DatAdd-10]>>(i-1)*4)%16];
else
TBUF[ByteCount*2-i+5]=ASCII[(byte[DatAdd]>>(i-1)*4)%16];
}
for(i=1,crc=0;i<=ByteCount*2+4;i++)
{  
crc^=TBUF;
}
TBUF[ByteCount*2+5]=ASCII[crc/16];
TBUF[ByteCount*2+6]=ASCII[crc%16];
TBUF[ByteCount*2+7]=0x0d;
for(i=0;i<ByteCount*2+8;i++)
DataSend(TBUF);
}
/*******下位机写函数********/
void WriteData(void)
{
uint i,dat,crc;
dat=AsciiToHex(&RecBuf[10],ByteCount*2);
if(ByteCount>1)
{
word[DatAdd-10]=dat;
}
else
{
byte[DatAdd]=dat;
}
TBUF[0]=0x40;
TBUF[1]=RecBuf[0];
TBUF[2]=RecBuf[1];
TBUF[3]=TBUF[4]=0x23;
crc=TBUF[1]^TBUF[2]^TBUF[3]^TBUF[4];
TBUF[5]=ASCII[crc/16];
TBUF[6]=ASCII[crc%16];
TBUF[7]=0x0d;
for(i=0;i<8;i++)
DataSend(TBUF);
}
5、Stm32与组态王通讯主程序部分
int main(void)
{
char CRCOK;
    char RWFlag;
uint ii=0;
    uchar DevAddr;
    uchar BUF2438[8];
    RCC_Configuration();
   
usart1_config();
TIM3_configuration();
nvic_config();
while(1)
   {
if(RecOK) //串口接收完成
{
RecOK=0;
DevAddr=AsciiToHex(&RecBuf[0],2); //检查设备地址是否是本机地址
if(DevAddr==LOCAL)
  {
   RWFlag=(char)(AsciiToHex(&RecBuf[2],2)&0x01); //判断读写标志 0:读    1:写
   DatAdd=AsciiToHex(&RecBuf[4],4);//获取数据地址
   ByteCount=AsciiToHex(&RecBuf[8],2);//数据字节数
   if(!RWFlag)//RWFlag=0,主机读数据
  {
CRCOK=ChackCRC();
   if(CRCOK)
{ //CRC校验OK
  ReadData();
                 }//发送数据    else
{
  Error(); //否则返回数据到主机
}
     }
   else //RWFlag=1   主机写数据
  {
             CRCOK=ChackCRC();
   if(CRCOK) //CRC校验OK
  WriteData(); //写数据    else
  Error(); //错误 }
}
else RecCount=0; //清除串口接收数据计数
}
   }
}


万分感谢。
沙发
张鋆|  楼主 | 2014-9-4 19:04 | 只看该作者
uchar AsciiToHex(uchar *StartAdd,uchar n)
{
uchar i,d;
    for(i=0;i<n;i++)
  {
d<<=4;
    if(StartAdd>0x40) d=d+(StartAdd-0x37);
    else d=d+(StartAdd-0x30);
}
    return (d);
}
这里编译总是不对呢?
..\main.c(99): error:  #42: operand types are incompatible ("unsigned char *" and "int")
..\main.c(99): error:  #513: a value of type "unsigned char *" cannot be assigned to an entity of type "unsigned char"
..\main.c(100): error:  #513: a value of type "unsigned char *" cannot be assigned to an entity of type "unsigned char"
这是给出的错误。

使用特权

评论回复
板凳
mmuuss586| | 2014-9-4 19:45 | 只看该作者
就是和触摸屏通讯吧?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
张鋆 + 1 您说的对!
地板
mmuuss586| | 2014-9-4 19:51 | 只看该作者
改成这样:
uchar AsciiToHex(uchar *StartAdd,uchar n)
{
uchar i,d;
    for(i=0;i<n;i++)
  {
                d<<=4;
    if(*StartAdd>0x40)
                        d=d+(*StartAdd-0x37);
    else
                        d=d+(*StartAdd-0x30);
        }
    return (d);
}

使用特权

评论回复
5
mmuuss586| | 2014-9-4 19:53 | 只看该作者
上面程序只能保证,你编译能通过;
StartAdd++;
应该还要加上这个;

使用特权

评论回复
6
张鋆|  楼主 | 2014-9-4 20:00 | 只看该作者
对,就是想做一个上位机,用组态王组态一下,不知道您有这方面经验吗?谢谢您了。关于单片机地址和数据地址,在组态王中怎么设置您知道吗?

使用特权

评论回复
7
张鋆|  楼主 | 2014-9-4 20:30 | 只看该作者
char ChackCRC(void)
{
uchar i,xordat,crc;
crc=AsciiToHex(&RecBuf[RecCount-2],2);
for(i=0,xordat=0;i<RecCount-2;i++)
xordat^=RecBuf;
RecCount=0;
if(crc==xordat) return 1;
else return 0;
}
还有这个里边的xordat^=RecBuf;这一句也有问题。
编译显示..\main.c(116): error:  #31: expression must have integral type
.. \ main.c中(115):错误:#31:表达式必须具有整数类型
这个怎么办呢?

使用特权

评论回复
8
张鋆|  楼主 | 2014-9-4 20:52 | 只看该作者
通用单片机ASCII协议支持单片机与组态王通讯,用户只要按照我们的协议编写单片机通讯程

序就可实现与组态王的通讯.

组态王设置

1、定义组态王设备

定义组态王定义设备时请选择:智能模块\单片机\通用单片机ASCII\串口

组态王的设备地址定义格式:##.#

前面的两个字符是设备地址,范围为0-255,此地址为单片机的地址,由单片机中的程序决定;

后面的一个字符是用户设定是否打包,"0"为不打包、"1"为打包,用户一旦在定义设备时确定了

打包,组态王将处理读下位机变量时数据打包的工作,与单片机的程序无关.

2、组态王通讯

通讯方式:RS-232,RS-485,RS-422均可。

波特率: 由单片机决定(2400,4800,9600and19200bps)。

注意:在组态王中设置的通讯参数如波特率,数据位,停止位,奇偶校验必须与单片机编程中

的通讯参数一致

使用特权

评论回复
9
张鋆|  楼主 | 2014-9-9 20:46 | 只看该作者
这个已经调试完了。

使用特权

评论回复
10
dianzixili| | 2015-5-11 18:47 | 只看该作者
您好,本人最近在做STM32与组态王的通信,查了很多资料一直没有什么头绪,有幸看到您的求助帖,并看到您在最后已经调试结束,所以如果方便的话,非常希望您能发一份下位机stm32的程序给我好吗,非常感谢您~

使用特权

评论回复
11
dianzixili| | 2015-5-11 18:48 | 只看该作者
我的邮箱是:1256963719@qq.com

使用特权

评论回复
12
imxiaren| | 2015-9-11 15:19 | 只看该作者
你好,能不能也发我一份,今天也在做组态王和stm32的串口通讯,能连接上,就是数据不对,怀疑是协议这方面的问题。烦请发我一份你验证好的代码吧,学习学习。谢谢啦,451980030@qq.com

使用特权

评论回复
13
1021256354| | 2015-9-11 15:25 | 只看该作者
这好像是modbus通信吧

使用特权

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

本版积分规则

3

主题

14

帖子

3

粉丝