2013-03-11 45 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毫秒綽綽有餘

相關問題