无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;
}
结果: