2013-03-11 60 views
1

我正在开发一个具有GSM模块的项目,它也与计算机串行通信。GSM模块和计算机之间的串行通信

我已经在C上编写了Visual Studio 2010中的代码来串行传输和接收数据。

守则如下: -

#include "stdafx.h" 
#include <windows.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <commdlg.h> 
int nread,nwrite; 


int main() 
{ 

COMMTIMEOUTS timeouts; 
COMMCONFIG dcbSerialParams; 
char *words, *buffRead, *buffWrite; 
DWORD dwBytesWritten,dwBytesRead; 

HANDLE hSerial= CreateFile(L"COM1", GENERIC_READ | GENERIC_WRITE, 
         0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); 
if (hSerial == INVALID_HANDLE_VALUE) 
{ 
if (GetLastError() == ERROR_FILE_NOT_FOUND) 
{ 
printf(" serial port does not exist \n"); 
} 
printf(" some other error occured. Inform user.\n"); 
} 


//DCB dcbSerialParams ; 
//GetCommState(hSerial, &dcbSerialParams.dcb); 
if (!GetCommState(hSerial, &dcbSerialParams.dcb)) 
{ 
printf("error getting state \n"); 
} 

dcbSerialParams.dcb.DCBlength = sizeof(dcbSerialParams.dcb); 


dcbSerialParams.dcb.BaudRate = CBR_9600; 
dcbSerialParams.dcb.ByteSize = 8; 
dcbSerialParams.dcb.StopBits = ONESTOPBIT; 
dcbSerialParams.dcb.Parity = NOPARITY; 

dcbSerialParams.dcb.fBinary = TRUE; 
dcbSerialParams.dcb.fDtrControl = DTR_CONTROL_DISABLE; 
dcbSerialParams.dcb.fRtsControl = RTS_CONTROL_DISABLE; 
dcbSerialParams.dcb.fOutxCtsFlow = FALSE; 
dcbSerialParams.dcb.fOutxDsrFlow = FALSE; 
dcbSerialParams.dcb.fDsrSensitivity= FALSE; 
dcbSerialParams.dcb.fAbortOnError = TRUE; 


if (!SetCommState(hSerial, &dcbSerialParams.dcb)) 
{ 
printf(" error setting serial port state \n"); 
} 


GetCommTimeouts(hSerial,&timeouts); 
//COMMTIMEOUTS timeouts = {0}; 

timeouts.ReadIntervalTimeout = 1000; 
timeouts.ReadTotalTimeoutConstant = 1000; 
timeouts.ReadTotalTimeoutMultiplier = 1000; 
timeouts.WriteTotalTimeoutConstant = 1000; 
timeouts.WriteTotalTimeoutMultiplier= 1000; 

if(!SetCommTimeouts(hSerial, &timeouts)) 
{ 
printf("error setting port state \n"); 
} 
while(1) 
{ 
//****************Write Operation*********************// 
char data_tx[]="at\r"; 
words=&data_tx[0]; 
nwrite = strlen(words); 
buffWrite = words; 
dwBytesWritten = 0; 

if (!WriteFile(hSerial, buffWrite, nwrite, &dwBytesWritten, NULL)) 
{ 
printf("error writing to output buffer \n"); 
} 
printf("Data written to write buffer is\n %s \n",buffWrite); 


//***************Read Operation******************// 
dwBytesRead = 0; 
nread = strlen(words); 
buffRead = new char[nread +1]; 
memset(buffRead, 0, nread+1); // ensure that string will be null-terminated 

if (!ReadFile(hSerial, buffRead, nread, &dwBytesRead, NULL)) 
{ 
printf("error reading from input buffer \n"); 
} 
printf("Data read from read buffer is \n %s \n ",buffRead); 
Sleep(10000); 
} 
CloseHandle(hSerial); 

} 

当命令“在\ r”是从计算机到GSM模块发送接收它应该通过发送OK回应。

现在我只得到O。如果我再次发送“在\ r”我得到K

我已经验证了它的超级终端GSM模块工作properly.If我送“在”并输入与OK响应。

此外,我已验证我的C代码在其他程序正常工作。

我想知道为什么它不能与GSM模块正常工作。

+1

您在阅读之前是否检查过'nread'并且在阅读完后检查了'dwBytesRead'? – Alex 2013-03-11 11:39:42

+0

也许这将有助于: [?ReadFile的只读一个缓冲字符(http://stackoverflow.com/questions/6959302/readfile-only-reading-one-buffer-character) – Alex 2013-03-11 11:45:10

+0

@Alex谢谢您帮帮我。我通过在没有GSM模块的情况下串行地在微控制器和计算机之间传输和接收5个字符的字符串来验证我的代码,并且代码正常工作 – 2013-03-11 12:07:27

回答

0

您需要在阅读结果之前调用睡眠。 250毫秒绰绰有余

相关问题