向各位请教一个串口通讯的问题 使用 VARIANT 类型,在MSDN里查 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用outp()例如:handle=0x3e8;outp(handle,0x77);outp(handle,'3');...... 用createfile()初始化端口,writefile()写端口,这是windows ApI 函数,在vc 中可用,具体看程序资料 HANDLE m_hCom; //通讯口句柄 DCB dcb; //设备控制模块 COMSTAT comStat; //串口状态 BOOL DevState[64]; //保存设备状态 BYTE Command[20]; //一体化摄像头控制数据 int i; DWORD lpNumber; int oper; BOOL Error; if(kongzhilx == 0) { switch(Make) { case AL578CR: switch(Direction) { case COM_YUNTAI_LEFT: Command[0]=0x02; //STX Command[1]=Address; //Adr Command[2]=0x01; //Cmd Command[3]=0x02; //Data1 Pan Left Command[4]=0x00; //Data2 Command[5]=0; //CheckSum for(i=0;i<5;i++) Command[5]+=Command[i]; Command[5]=Command[5]%256; Speed[0]=0x02; //STX Speed[1]=Address; //Adr Speed[2]=0x0E; //Cmd Speed[3]=MoveSpeed; //速度64 Speed[4]=0x00; //Data2 Speed[5]=0; //CheckSum for(i=0;i<5;i++) Speed[5]+=Speed[i]; Speed[5]=Speed[5]%256; break; case COM_YUNTAI_RIGHT: Command[0]=0x02; //STX Command[1]=Address; //Adr Command[2]=0x01; //Cmd Command[3]=0x01; //Data1 Pan Left Command[4]=0x00; //Data2 Command[5]=0; //CheckSum for(i=0;i<5;i++) Command[5]+=Command[i]; Command[5]=Command[5]%256; Speed[0]=0x02; //STX Speed[1]=Address; //Adr Speed[2]=0x0E; //Cmd Speed[3]=MoveSpeed; //速度64 Speed[4]=0x00; //Data2 Speed[5]=0; //CheckSum for(i=0;i<5;i++) Speed[5]+=Speed[i]; Speed[5]=Speed[5]%256; break; case COM_YUNTAI_UP: Command[0]=0x02; //STX Command[1]=Address; //Adr Command[2]=0x01; //Cmd Command[3]=0x04; //Data1 Pan Left Command[4]=0x00; //Data2 Command[5]=0; //CheckSum for(i=0;i<5;i++) Command[5]+=Command[i]; Command[5]=Command[5]%256; Speed[0]=0x02; //STX Speed[1]=Address; //Adr Speed[2]=0x0E; //Cmd Speed[3]=0x00; //速度64 Speed[4]=MoveSpeed; //Data2 Speed[5]=0; //CheckSum for(i=0;i<5;i++) Speed[5]+=Speed[i]; Speed[5]=Speed[5]%256; break; case COM_YUNTAI_DOWN: Command[0]=0x02; //STX Command[1]=Address; //Adr Command[2]=0x01; //Cmd Command[3]=0x08; //Data1 Pan Left Command[4]=0x00; //Data2 Command[5]=0; //CheckSum for(i=0;i<5;i++) Command[5]+=Command[i]; Command[5]=Command[5]%256; Speed[0]=0x02; //STX Speed[1]=Address; //Adr Speed[2]=0x0E; //Cmd Speed[3]=0x00; //速度64 Speed[4]=MoveSpeed; //Data2 Speed[5]=0; //CheckSum for(i=0;i<5;i++) Speed[5]+=Speed[i]; Speed[5]=Speed[5]%256; break; case COM_YUNTAI_STOP: Command[0]=0x02; //STX Command[1]=Address; //Adr Command[2]=0x01; //Cmd Command[3]=0x00; //Data1 Pan Left Command[4]=0x00; //Data2 Command[5]=0; //CheckSum for(i=0;i<5;i++) Command[5]+=Command[i]; Command[5]=Command[5]%256; Speed[0]=0x02; //STX Speed[1]=Address; //Adr Speed[2]=0x0E; //Cmd Speed[3]=0x00; //速度64 Speed[4]=0x00; //Data2 Speed[5]=0; //CheckSum for(i=0;i<5;i++) Speed[5]+=Speed[i]; Speed[5]=Speed[5]%256; break; case ZOOMWIDE: Command[0]=0x02; //STX Command[1]=Address; //Adr Command[2]=0x01; //Cmd Command[3]=0x10; //Data1 Pan Left Command[4]=0x00; //Data2 Command[5]=0; //CheckSum for(i=0;i<5;i++) Command[5]+=Command[i]; Command[5]=Command[5]%256; Speed[0]=0x02; //STX Speed[1]=Address; //Adr Speed[2]=0x0E; //Cmd Speed[3]=0x00; //速度64 Speed[4]=0x00; //Data2 Speed[5]=0; //CheckSum for(i=0;i<5;i++) Speed[5]+=Speed[i]; Speed[5]=Speed[5]%256; break; case ZOOMTELE: Command[0]=0x02; //STX Command[1]=Address; //Adr Command[2]=0x01; //Cmd Command[3]=0x20; //Data1 Pan Left Command[4]=0x00; //Data2 Command[5]=0; //CheckSum for(i=0;i<5;i++) Command[5]+=Command[i]; Command[5]=Command[5]%256; Speed[0]=0x02; //STX Speed[1]=Address; //Adr Speed[2]=0x0E; //Cmd Speed[3]=0x00; //速度64 Speed[4]=0x00; //Data2 Speed[5]=0; //CheckSum for(i=0;i<5;i++) Speed[5]+=Speed[i]; Speed[5]=Speed[5]%256; break; case FOCUSNEAR: Command[0]=0x02; //STX Command[1]=Address; //Adr Command[2]=0x01; //Cmd Command[3]=0x40; //Data1 Pan Left Command[4]=0x00; //Data2 Command[5]=0; //CheckSum for(i=0;i<5;i++) Command[5]+=Command[i]; Command[5]=Command[5]%256; Speed[0]=0x02; //STX Speed[1]=Address; //Adr Speed[2]=0x0E; //Cmd Speed[3]=0x00; //速度64 Speed[4]=0x00; //Data2 Speed[5]=0; //CheckSum for(i=0;i<5;i++) Speed[5]+=Speed[i]; Speed[5]=Speed[5]%256; break; case FOCUSFAR: Command[0]=0x02; //STX Command[1]=Address; //Adr Command[2]=0x01; //Cmd Command[3]=0x80; //Data1 Pan Left Command[4]=0x00; //Data2 Command[5]=0; //CheckSum for(i=0;i<5;i++) Command[5]+=Command[i]; Command[5]=Command[5]%256; Speed[0]=0x02; //STX Speed[1]=Address; //Adr Speed[2]=0x0E; //Cmd Speed[3]=0x00; //速度64 Speed[4]=0x00; //Data2 Speed[5]=0; //CheckSum for(i=0;i<5;i++) Speed[5]+=Speed[i]; Speed[5]=Speed[5]%256; break; default: break; } m_hCom=InitYiti(Make,Kongzhi); //串口初始化 if(m_hCom==NULL) {// AfxMessageBox("串口初始化失败!"); return FALSE; } Error = WriteFile(m_hCom,Speed,6,&lpNumber,NULL); //send the data of bytes if(!Error) {// AfxMessageBox("发送命令失败 !"); CloseHandle(m_hCom); return FALSE; } Error = WriteFile(m_hCom,Command,6,&lpNumber,NULL); //send the data of bytes if(!Error) {// AfxMessageBox("发送命令失败 !"); CloseHandle(m_hCom); return FALSE; }HANDLE CControlIO::InitYuntai(int Make){ HANDLE hCom = CreateFile("COM2",GENERIC_READ|GENERIC_WRITE, 0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED ,NULL); if(hCom == INVALID_HANDLE_VALUE) { AfxMessageBox("CreateFile()失败 InitYuntai!"); return NULL; } BOOL Error = SetupComm(hCom,128,128); //创建输入输出队列缓存 if(!Error) CloseHandle(hCom); Error = GetCommState(hCom,&dcb); //得到串口状态 if(!Error) CloseHandle(hCom); //设置COM2通信参数 switch(Make){ case ADT: dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = MARKPARITY; dcb.StopBits = ONESTOPBIT; break; case M832: dcb.BaudRate = m_intCom2Speed; dcb.ByteSize = 8; dcb.Parity = MARKPARITY; dcb.StopBits = ONESTOPBIT; break; } Error = SetCommState(hCom,&dcb); if(!Error) { CloseHandle(hCom); } EscapeCommFunction(hCom,SETRTS);//设置为发送状态 return hCom;} void CComIO::OutPut(const CByteArray &Data){ m_pMSComCtrl->SetOutput(COleVariant(Data));}void CComIO::OutPut(BYTE *pData, int Length){ int i; CByteArray Data; Data.SetSize(Length); for(i=0;i<Length;i++,pData++) Data[i]=*pData; OutPut(Data);}void CComIO::OutPut(CString Str){ int i,Length; CByteArray Data; Length=Str.GetLength(); Data.SetSize(Length); for(i=0;i<Length;i++) Data[i]=Str[i]; OutPut(Data);} vastsky(戴二郎) ,能再说的具体些吗? handle的值是什么? DCB dcb;char data[1024],recv_data[1024];DWORD len,send_len,error_code; hCom = CreateFile("com2", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, //FILE_FLAG_OVERLAPPED, NULL); printf("comm2 handl is %d \n",hCom); GetCommState(hCom, &dcb ) ; dcb.BaudRate =4800; dcb.ByteSize =8; // dcb.Parity = SPACEPARITY; dcb.Parity = MARKPARITY;// 送地址 dcb.fBinary = TRUE ; dcb.fParity = TRUE; SetCommState(hCom, &dcb ) ; //串口参数配置 strcpy(data,"send address"); WriteFile(hCom,data,strlen(data),&len,0);。 dcb.Parity = SPACEPARITY;// 关数据 SetCommState(hCom, &dcb ) ; //串口参数配置 strcpy(data,"send normal data"); WriteFile(hCom,data,strlen(data),&len,0); chenhq(chenhq) 再请问一下 ,我那个地址,如果按协议里,是第9位还要为1,那我那个云台不就变成0x101了?放不进byte里了? 不是,第9位是放在SFR中,放在另外的寄存器里,不是放在数据PBUF里 不是,第9位是放在SFR中,放在另外的寄存器里,**是放在数据PBUF里 feng_sky(海峰) 你的意思是不是,如果发地址,奇偶校验为 dcb.Parity = MARKPARITY;// 送地址送数据为 // dcb.Parity = SPACEPARITY;那我得分两次发送了? feng_sky奇偶校验就是选上面这两种吧?还有一个小问题,我的串口还用来接收数据,比如会从串口传来S11E的字符串,原来我的奇偶校验是N,现在改成这样以后,如果再有字符串传来,在MARKPARITY、SPACEPARITY下会受到影响吗? 数据可以收到。用ClearCommError(hComm1,&error_code,NULL);可能得到校验的错误。 // dcb.Parity = SPACEPARITY;//dcb.Parity = MARKPARITY;// 送地址上面分别为0校验和1校验。与数据的1奇偶无关系。 单文档中的逻辑坐标问题 怎样在内核拦截 ring3 的 ControlService 函数, 使得驱动不能被停止? 为什么打字时间长点就变成停滞状态??? 线程无法启动问题 如何得到当前光标的在客户区的CPoint的位置? 请问谁有字典数据压缩的好方法?谢谢! 关于设置CListCtrl背景问题的请教! VS2010 如何使用别人的控件类。 WebBrowser如何访问CHM网页内容 MFC怎么读取XML文件 关于CREATESTRUCT 这个数据结构 为什么我的问题没有人回答那???
例如:
handle=0x3e8;
outp(handle,0x77);
outp(handle,'3');
......
DCB dcb; //设备控制模块
COMSTAT comStat; //串口状态 BOOL DevState[64]; //保存设备状态
BYTE Command[20]; //一体化摄像头控制数据 int i;
DWORD lpNumber;
int oper;
BOOL Error;
if(kongzhilx == 0)
{
switch(Make)
{
case AL578CR:
switch(Direction)
{
case COM_YUNTAI_LEFT:
Command[0]=0x02; //STX
Command[1]=Address; //Adr
Command[2]=0x01; //Cmd
Command[3]=0x02; //Data1 Pan Left
Command[4]=0x00; //Data2
Command[5]=0; //CheckSum
for(i=0;i<5;i++)
Command[5]+=Command[i];
Command[5]=Command[5]%256; Speed[0]=0x02; //STX
Speed[1]=Address; //Adr
Speed[2]=0x0E; //Cmd
Speed[3]=MoveSpeed; //速度64
Speed[4]=0x00; //Data2
Speed[5]=0; //CheckSum
for(i=0;i<5;i++)
Speed[5]+=Speed[i];
Speed[5]=Speed[5]%256;
break;
case COM_YUNTAI_RIGHT:
Command[0]=0x02; //STX
Command[1]=Address; //Adr
Command[2]=0x01; //Cmd
Command[3]=0x01; //Data1 Pan Left
Command[4]=0x00; //Data2
Command[5]=0; //CheckSum
for(i=0;i<5;i++)
Command[5]+=Command[i];
Command[5]=Command[5]%256; Speed[0]=0x02; //STX
Speed[1]=Address; //Adr
Speed[2]=0x0E; //Cmd
Speed[3]=MoveSpeed; //速度64
Speed[4]=0x00; //Data2
Speed[5]=0; //CheckSum
for(i=0;i<5;i++)
Speed[5]+=Speed[i];
Speed[5]=Speed[5]%256;
break;
case COM_YUNTAI_UP:
Command[0]=0x02; //STX
Command[1]=Address; //Adr
Command[2]=0x01; //Cmd
Command[3]=0x04; //Data1 Pan Left
Command[4]=0x00; //Data2
Command[5]=0; //CheckSum
for(i=0;i<5;i++)
Command[5]+=Command[i];
Command[5]=Command[5]%256; Speed[0]=0x02; //STX
Speed[1]=Address; //Adr
Speed[2]=0x0E; //Cmd
Speed[3]=0x00; //速度64
Speed[4]=MoveSpeed; //Data2
Speed[5]=0; //CheckSum
for(i=0;i<5;i++)
Speed[5]+=Speed[i];
Speed[5]=Speed[5]%256;
break;
case COM_YUNTAI_DOWN:
Command[0]=0x02; //STX
Command[1]=Address; //Adr
Command[2]=0x01; //Cmd
Command[3]=0x08; //Data1 Pan Left
Command[4]=0x00; //Data2
Command[5]=0; //CheckSum
for(i=0;i<5;i++)
Command[5]+=Command[i];
Command[5]=Command[5]%256; Speed[0]=0x02; //STX
Speed[1]=Address; //Adr
Speed[2]=0x0E; //Cmd
Speed[3]=0x00; //速度64
Speed[4]=MoveSpeed; //Data2
Speed[5]=0; //CheckSum
for(i=0;i<5;i++)
Speed[5]+=Speed[i];
Speed[5]=Speed[5]%256;
break;
case COM_YUNTAI_STOP:
Command[0]=0x02; //STX
Command[1]=Address; //Adr
Command[2]=0x01; //Cmd
Command[3]=0x00; //Data1 Pan Left
Command[4]=0x00; //Data2
Command[5]=0; //CheckSum
for(i=0;i<5;i++)
Command[5]+=Command[i];
Command[5]=Command[5]%256;
Speed[0]=0x02; //STX
Speed[1]=Address; //Adr
Speed[2]=0x0E; //Cmd
Speed[3]=0x00; //速度64
Speed[4]=0x00; //Data2
Speed[5]=0; //CheckSum
for(i=0;i<5;i++)
Speed[5]+=Speed[i];
Speed[5]=Speed[5]%256;
break;
case ZOOMWIDE:
Command[0]=0x02; //STX
Command[1]=Address; //Adr
Command[2]=0x01; //Cmd
Command[3]=0x10; //Data1 Pan Left
Command[4]=0x00; //Data2
Command[5]=0; //CheckSum
for(i=0;i<5;i++)
Command[5]+=Command[i];
Command[5]=Command[5]%256;
Speed[0]=0x02; //STX
Speed[1]=Address; //Adr
Speed[2]=0x0E; //Cmd
Speed[3]=0x00; //速度64
Speed[4]=0x00; //Data2
Speed[5]=0; //CheckSum
for(i=0;i<5;i++)
Speed[5]+=Speed[i];
Speed[5]=Speed[5]%256;
break;
case ZOOMTELE:
Command[0]=0x02; //STX
Command[1]=Address; //Adr
Command[2]=0x01; //Cmd
Command[3]=0x20; //Data1 Pan Left
Command[4]=0x00; //Data2
Command[5]=0; //CheckSum
for(i=0;i<5;i++)
Command[5]+=Command[i];
Command[5]=Command[5]%256; Speed[0]=0x02; //STX
Speed[1]=Address; //Adr
Speed[2]=0x0E; //Cmd
Speed[3]=0x00; //速度64
Speed[4]=0x00; //Data2
Speed[5]=0; //CheckSum
for(i=0;i<5;i++)
Speed[5]+=Speed[i];
Speed[5]=Speed[5]%256;
break;
case FOCUSNEAR:
Command[0]=0x02; //STX
Command[1]=Address; //Adr
Command[2]=0x01; //Cmd
Command[3]=0x40; //Data1 Pan Left
Command[4]=0x00; //Data2
Command[5]=0; //CheckSum
for(i=0;i<5;i++)
Command[5]+=Command[i];
Command[5]=Command[5]%256; Speed[0]=0x02; //STX
Speed[1]=Address; //Adr
Speed[2]=0x0E; //Cmd
Speed[3]=0x00; //速度64
Speed[4]=0x00; //Data2
Speed[5]=0; //CheckSum
for(i=0;i<5;i++)
Speed[5]+=Speed[i];
Speed[5]=Speed[5]%256;
break;
case FOCUSFAR:
Command[0]=0x02; //STX
Command[1]=Address; //Adr
Command[2]=0x01; //Cmd
Command[3]=0x80; //Data1 Pan Left
Command[4]=0x00; //Data2
Command[5]=0; //CheckSum
for(i=0;i<5;i++)
Command[5]+=Command[i];
Command[5]=Command[5]%256; Speed[0]=0x02; //STX
Speed[1]=Address; //Adr
Speed[2]=0x0E; //Cmd
Speed[3]=0x00; //速度64
Speed[4]=0x00; //Data2
Speed[5]=0; //CheckSum
for(i=0;i<5;i++)
Speed[5]+=Speed[i];
Speed[5]=Speed[5]%256;
break;
default:
break;
} m_hCom=InitYiti(Make,Kongzhi); //串口初始化
if(m_hCom==NULL)
{
// AfxMessageBox("串口初始化失败!");
return FALSE;
}
Error = WriteFile(m_hCom,Speed,6,&lpNumber,NULL); //send the data of bytes
if(!Error)
{
// AfxMessageBox("发送命令失败 !");
CloseHandle(m_hCom);
return FALSE;
} Error = WriteFile(m_hCom,Command,6,&lpNumber,NULL); //send the data of bytes
if(!Error)
{
// AfxMessageBox("发送命令失败 !");
CloseHandle(m_hCom);
return FALSE;
}HANDLE CControlIO::InitYuntai(int Make)
{
HANDLE hCom = CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,
0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED ,NULL);
if(hCom == INVALID_HANDLE_VALUE)
{
AfxMessageBox("CreateFile()失败 InitYuntai!");
return NULL;
}
BOOL Error = SetupComm(hCom,128,128); //创建输入输出队列缓存
if(!Error)
CloseHandle(hCom);
Error = GetCommState(hCom,&dcb); //得到串口状态
if(!Error)
CloseHandle(hCom); //设置COM2通信参数
switch(Make){
case ADT:
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = MARKPARITY;
dcb.StopBits = ONESTOPBIT;
break;
case M832:
dcb.BaudRate = m_intCom2Speed;
dcb.ByteSize = 8;
dcb.Parity = MARKPARITY;
dcb.StopBits = ONESTOPBIT;
break;
} Error = SetCommState(hCom,&dcb);
if(!Error)
{
CloseHandle(hCom);
} EscapeCommFunction(hCom,SETRTS);//设置为发送状态 return hCom;
}
{
m_pMSComCtrl->SetOutput(COleVariant(Data));
}void CComIO::OutPut(BYTE *pData, int Length)
{
int i;
CByteArray Data;
Data.SetSize(Length);
for(i=0;i<Length;i++,pData++)
Data[i]=*pData;
OutPut(Data);
}void CComIO::OutPut(CString Str)
{
int i,Length;
CByteArray Data;
Length=Str.GetLength();
Data.SetSize(Length);
for(i=0;i<Length;i++)
Data[i]=Str[i];
OutPut(Data);
}
DWORD len,send_len,error_code; hCom = CreateFile("com2",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
//FILE_FLAG_OVERLAPPED,
NULL);
printf("comm2 handl is %d \n",hCom);
GetCommState(hCom, &dcb ) ;
dcb.BaudRate =4800;
dcb.ByteSize =8;
// dcb.Parity = SPACEPARITY;
dcb.Parity = MARKPARITY;// 送地址
dcb.fBinary = TRUE ;
dcb.fParity = TRUE;
SetCommState(hCom, &dcb ) ; //串口参数配置
strcpy(data,"send address");
WriteFile(hCom,data,strlen(data),&len,0);
。
dcb.Parity = SPACEPARITY;// 关数据
SetCommState(hCom, &dcb ) ; //串口参数配置 strcpy(data,"send normal data");
WriteFile(hCom,data,strlen(data),&len,0);
dcb.Parity = MARKPARITY;// 送地址
送数据为 // dcb.Parity = SPACEPARITY;
那我得分两次发送了?
用
ClearCommError(hComm1,&error_code,NULL);
可能得到校验的错误。
//dcb.Parity = MARKPARITY;// 送地址
上面分别为0校验和1校验。
与数据的1奇偶无关系。