迪文T5L屏 电脑端 更新时间 有CRC校验

参考:http://t.csdn.cn/6cSfC

无CRC校验的迪文论坛有,也可以自己改一下这个程序

T5L的显示屏用串口连到电脑

电脑端的代码如下:

#include <stdio.h>
#include <windows.h>
#include   <stdlib.h>
#include <string.h>
#include <conio.h>
#include <winnt.h>
#include <time.h>

#define CRC_CHECK_NUM (0xA001)

typedef  unsigned short  WORD;//16位
typedef  unsigned char  BYTE;//8位

unsigned char myArr[100];
int data;


WORD crc_modbusrtu(BYTE *ptr, BYTE len)
{
	BYTE i;
	WORD crc = 0xffff;
	WORD temp;

	if (len == 0) {
		len = 1;
	}
	while (len--) {
		crc ^= *ptr;
		for (i = 0; i<8; i++)
		{
			if (crc & 1) {
				crc >>= 1;
				crc ^= CRC_CHECK_NUM;
			}
			else {
				crc >>= 1;
			}
		}
		ptr++;
	}

	temp = crc>>8;
	temp |= (crc<<8);

	return(temp);
}


int main()
{
    int i;
    DWORD dwLength;
    char recvBuf[1024];
    DWORD dwactlen;
    char psendbuf[32] = "test\n";
    char ch;
    DCB myDCB;
    HANDLE m_hComm;

    WORD crc;

    time_t timep;
    struct tm *p;

    printf("请输入COM口:");
    scanf("%d",&data);
    sprintf(myArr,"COM%d:",data);

    m_hComm = CreateFile(
    myArr,
    GENERIC_READ | GENERIC_WRITE,   //允许读和写
    0,                          //独占方式(共享模式)
    NULL,
    OPEN_EXISTING,              //打开而不是创建(创建方式)
    0,
    NULL
    );
    if (m_hComm == (HANDLE)-1)                          //打开串口失败返回
    {
        printf("打开串口失败!\r\n");
        return 0;
    }
    else
    {
        printf("打开串口成功!\r\n");
    }
    //得到打开串口的当前属性参数,修改后再重新设置串口。


    if (!GetCommState(m_hComm, &myDCB))
    {
    printf("GetCommState error");
    return FALSE;
    }

    printf("请输入波特率:");
    scanf("%d",&data);

    //设置串口参数
    myDCB.BaudRate = data;   // 设置波特率9600
    myDCB.fBinary = TRUE; // 设置二进制模式,此处必须设置TRUE
    myDCB.fParity = TRUE; // 支持奇偶校验
    myDCB.fOutxCtsFlow = FALSE;  // No CTS output flow control
    myDCB.fOutxDsrFlow = FALSE;  // No DSR output flow control
    myDCB.fDtrControl = DTR_CONTROL_DISABLE; // No DTR flow control
    myDCB.fDsrSensitivity = FALSE; // DSR sensitivity
    myDCB.fTXContinueOnXoff = TRUE; // XOFF continues Tx
    myDCB.fOutX = FALSE;     // No XON/XOFF out flow control
    myDCB.fInX = FALSE;        // No XON/XOFF in flow control
    myDCB.fErrorChar = FALSE;    // Disable error replacement
    myDCB.fNull = FALSE;  // Disable null stripping
    myDCB.fRtsControl = RTS_CONTROL_DISABLE;   //No RTS flow control
    myDCB.fAbortOnError = FALSE;  // 当串口发生错误,并不终止串口读写
    myDCB.ByteSize = 8;   // 数据位,范围:4-8
    myDCB.Parity = NOPARITY; // 校验模式
    myDCB.StopBits = 0;   // 1位停止位
    //设置串口参数
    if (!SetCommState(m_hComm, &myDCB))
    {
        printf("SetCommState error");
        return FALSE;
    }
    SetupComm(m_hComm, 1024, 1024);//设置串口的输入/输出缓冲区大小
    PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR);
    COMMTIMEOUTS TimeOuts;
    //设定读超时
    TimeOuts.ReadIntervalTimeout = 1000;
    TimeOuts.ReadTotalTimeoutMultiplier = 500;
    TimeOuts.ReadTotalTimeoutConstant = 5000;
    //设定写超时
    TimeOuts.WriteTotalTimeoutMultiplier = 500;
    TimeOuts.WriteTotalTimeoutConstant = 2000;
    SetCommTimeouts(m_hComm, &TimeOuts); //设置超时 !mportant


    //ClearCommError(m_hComm, &dwReadErrors, &cmState);
    //printf("Input a character:");
    //ch = _getch();
    //printf("\nYou input a '%c'\n", ch);
    //psendbuf[0] = ch;

    time (&timep);
    p=gmtime(&timep);
    //printf("%d\n",p->tm_sec); /*获取当前秒*/
    //printf("%d\n",p->tm_min); /*获取当前分*/
    //printf("%d\n",8+p->tm_hour);/*获取当前时,这里获取西方的时间,刚好相差八个小时*/
    //printf("%d\n",p->tm_mday);/*获取当前月份日数,范围是1-31*/
    //printf("%d\n",1+p->tm_mon);/*获取当前月份,范围是0-11,所以要加1*/
    //printf("%d\n",1900+p->tm_year);/*获取当前年份,从1900开始,所以要加1900*/


    myArr[0] = 0X5A;
    myArr[1] = 0XA5;
    myArr[2] = 0X0D;
    myArr[3] = 0X82;
    myArr[4] = 0X00;
    myArr[5] = 0X9C;
    myArr[6] = 0X5A;
    myArr[7] = 0XA5;
    myArr[8] = p->tm_year-100;
    myArr[9] = 1+p->tm_mon;
    myArr[10] = p->tm_mday;
    myArr[11] = 8+p->tm_hour;
    myArr[12] = p->tm_min;
    myArr[13] = p->tm_sec;

    crc = crc_modbusrtu(&(myArr[3]),11);


    myArr[14] = (crc>>8);
    myArr[15] = crc;
    WriteFile(m_hComm, myArr,16, &dwactlen, NULL);


    printf("完成!\r\n");

    while (1)
    {
        //WriteFile(m_hComm, psendbuf, 32, &dwactlen, NULL);
        //ReadFile(m_hComm, recvBuf, 10, &dwLength, NULL);
        //printf("read success!\nread string: %s", recvBuf);
        //PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR);
    }

    /*WriteFile(m_hComm, psendbuf,32, &dwactlen, NULL);
    if (WriteFile(m_hComm, psendbuf, 32, &dwactlen, NULL))
    {
    printf("write success!\n");
    }
    else
    {
    printf("write failed!\n");
    }


    if (ReadFile(m_hComm, recvBuf, 10, &dwLength, NULL))
    {
    printf("read success!\nread string: %s", recvBuf);
    }
    else
    {
    printf("read failed!\n");
    }*/
    CloseHandle(m_hComm); //m_hComm是CreateFile函数返回的串口句柄。
    return 0;
}

结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值