How to transfer file through serial communication
hii friends,
i am using Qt3 which comes bydefault with FC-6 installation.
i want to transfer files like zip, pdf, jpeg etc through serial communication (i.e. using com port)
can anyone please tell me how can i achieve this?!?
if possible please provide me with a sample code.
Re: How to transfer file through serial communication
Please start by searching the forum.
Re: How to transfer file through serial communication
i've downloaded the QExtSerialPort1.1 from the net
in this when i go to the /example/ folder and type "make" to compile everything
it gives following error :
make
make: Warning: File `Makefile' has modification time 2.3e+08 s in the
future
g++ -c -pipe -Wall -W -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2
-fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32
-march=i386 -mtune=generic -fasynchronous-unwind-tables -D_REENTRANT
-D_TTY_POSIX_ -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -DQT_SHARED
-I/usr/lib/qt-3.3/mkspecs/default -I. -I../.. -I/usr/lib/qt-3.3/include
-Iuic/ -Imoc/ -o obj/main.o main.cpp
main.cpp:8:28: error: qextserialport.h: No such file or directory
In file included from main.cpp:12:
MessageWindow.h:12:25: error: qdockwidget.h: No such file or directory
MessageWindow.h:20: error: expected class-name before â{â token
MessageWindow.h:20: warning: âclass MessageWindowâ has virtual functions
but non-virtual destructor
make: *** [obj/main.o] Error 1
can anybody please help me with this ?
Re: How to transfer file through serial communication
Quote:
main.cpp:8:28: error: qextserialport.h: No such file or directory
This seems obvious - the file is missing.
Quote:
MessageWindow.h:12:25: error: qdockwidget.h: No such file or directory
This suggest you've downloaded the wrong release as QDockWidget is part of Qt4 and not Qt3.
Re: How to transfer file through serial communication
Quote:
Originally Posted by
shamik
...
MessageWindow.h:12:25: error: qdockwidget.h: No such file or directory
can anybody please help me with this ?
Look to the file. If it exists? Then look for QTDIR.
Re: How to transfer file through serial communication
u're right......i had downloaded a wrong package
now i have downloaded a correct one which works with Qt3. The make command has generated the libraries well.
but i dont know how to use this class and its functions.
all the function i found deals with byte transfer i.e. getch(), putch() etc.
but i want to transfer and recieve files like zip, pdf etc.
i cant find any such functions directly sending and recieving files...
can any1 plz suggest
Re: How to transfer file through serial communication
Use getch or putch in a loop.
Re: How to transfer file through serial communication
suppose its a zip file stored somewhere like /root/xp.zip
then how to use that getch() and putch() ??
Re: How to transfer file through serial communication
Oh come on.... What kind of a question is that?
Open the file, read characters and transmit them over the serial line. You'll probably need some protocol of communication to transfer the file length and file name. You can probably use QDataStream to ease your task.
Re: How to transfer file through serial communication
no need to use getch().
Just use readBytes() and you don't need a loop.
But the rest is the same as wysota said.
Re: How to transfer file through serial communication
Hi,
Plenty of serial comms classes on the web...
Personally, I use my own I wrote which is for windows, if it is for windows you want to use serial comms, just use api calls such as ::CreateFile, ::WriteFile etc...
Here is some code from my serial class, may help ( this is for Windows )?
Code:
template<class T=char, int nSize=100> class CSerialComms
{
public:
T& operator[]( int nIndex ) { return m_buf[nIndex]; }
CSerialComms& operator=( const CSerialComms& r )
{
memcpy( m_buf, r.m_buf, nSize );
m_cto = r.m_cto;
m_dcb = r.m_dcb;
m_hFile = r.m_hFile;
return *this;
}
inline int SetTimeouts( DWORD dwReadInterval = 1, DWORD dwReadTotalTimeout = 100, DWORD dwReadTotalTimeoutConstant = 1000, DWORD dwWriteTotalTimeout = 0, DWORD dwWriteTotalTimeoutConstant = 0 )
{
int nError = SUCCESS;
m_cto.ReadIntervalTimeout = dwReadInterval;
m_cto.ReadTotalTimeoutMultiplier = dwReadTotalTimeout;
m_cto.ReadTotalTimeoutConstant = dwReadTotalTimeoutConstant;
m_cto.WriteTotalTimeoutMultiplier = dwWriteTotalTimeout;
m_cto.WriteTotalTimeoutConstant = dwWriteTotalTimeoutConstant;
if( !::SetCommTimeouts( m_hFile, &m_cto) )
{
nError = GetLastError();
}
return nError;
}
inline int OpenPort( LPCTSTR szPort = "COM1" )
{
int nError = SUCCESS;
m_hFile = ::CreateFile( szPort, GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if( m_hFile == INVALID_HANDLE_VALUE )
{
nError = GetLastError();
}
return nError;
}
inline int SetCommsDevice( DWORD dwBaud = 57600, BYTE iParity = NOPARITY, BYTE iStopBits = ONESTOPBIT, BYTE iByteSize = 8 )
{
int nError = SUCCESS;
memset( &m_dcb, 0, sizeof( m_dcb ) );
m_dcb.DCBlength = sizeof( m_dcb );
m_dcb.BaudRate = dwBaud;
m_dcb.Parity = iParity;
m_dcb.StopBits = iStopBits;
m_dcb.ByteSize = iByteSize;
if( !::SetCommState( m_hFile, &m_dcb ) )
{
nError = GetLastError();
}
return nError;
}
DWORD TxData( T* szBuf )
{
DWORD nowrote = 0;
memset( m_buf, 0, sizeof( m_buf ) );
if( sizeof( m_buf ) >= strlen( szBuf ) ) // check to see if buffer allocated is big enough
{
memcpy( &m_buf[1], szBuf, strlen( szBuf ) );
m_buf[0] = 0x2;
m_buf[ strlen(szBuf) + 1 ] = 0x3;
return TxData();
}
return BUFFEROVERFLOW;
}
DWORD TxData()
{
DWORD nowrote = 0;
::WriteFile( m_hFile, m_buf, strlen(m_buf), &nowrote, NULL );
return nowrote;
}
CSerialComms( void ){ memset( m_buf, 0, nSize ); };
~CSerialComms(){};
private:
T m_buf[nSize];
COMMTIMEOUTS m_cto;
DCB m_dcb;
HANDLE m_hFile;
enum { FAILED = 0, SUCCESS = 1, BUFFEROVERFLOW = 2 };
};
#endif // !defined(AFX_SERIALCOMMS_H__BA76EBFF_6F02_4E79_BC65_DD4C2655354B__INCLUDED_)
Regards,
Steve
Re: How to transfer file through serial communication
Quote:
Plenty of serial comms classes on the web...
True, but QextSerialPort is based on QIODevice and therefore integrates well withe Qt Stream classes, and you can sublass it and add signals and slots to it (if you need such a thing, I didn't so far)
And ofcourse, QextSerialPort is cross platform!
Re: How to transfer file through serial communication
here's wat i have done
Qt Code :
Code:
int size;
int *i,j,k;
QFile file("/sfiles/mxdrv.tgz");
if(!file.open( IO_ReadOnly ))
{
QMessageBox::information(0,
"Error",
"Error opening file");
}
else
{
cout<<"File opened successfully"<<endl;
}
cout<<"file opened...."<<endl;
unsigned char fname[]="mxdrv.tgz";
struct termios t;
char *device = "/dev/ttyS0";
int sPort, rbyte, status, sPortdest,length;
long count=0;
unsigned char send1[32];
t.c_cc[VMIN] = 1;
t.c_cc[VTIME]=0;
t.c_cc[VEOF]='\n';
t.c_iflag |= (ISIG);
t.c_iflag &= ~BRKINT;
t.c_cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL;
sPort = open(device,O_RDWR|O_NOCTTY|O_NDELAY);
if(sPort != -1)
{
cout<<"open successfully\n";
status = ioctl(sPort,TCSETS,&t);
cout<<"Entering status"<<status<<endl;
if(status==0)
{
//for(count=0;count<20;count++)
cout<<"sending name"<<endl;
rbyte=write(sPort,fname,strlen((char *)send1));
//usleep(3000);
cout<<"name sent"<<endl;
cout<<"now sending file"<<endl;
while(!file.atEnd())
{
//cout<<"Enter :";
//cin>>send1;
//strcat((char *)send1,"{MSS TYPE-D DAMA}");
// write(sPort,"{012345678}",11);
*i=file.getch();
rbyte=write(sPort,i,sizeof(*i));
cout<<rbyte<<"sent"<<endl;
//cout<<"w b:"<<rbyte<<"\t Time:"<<count<<"\t string:"<<send1<<"\n";
//usleep(1000);
}
}
close(sPort);
}
else
{
cout<<"Device could not be opened";
}
file.close();
by running this code from the shell, following is the output :
File opened successfully
file opened....
open successfully
Entering status0
sending name
name sent
now sending file
Segmentation fault
can any1 please tell watz going wrong over here ??
Re: How to transfer file through serial communication
As far as I can see, int *i is not allocated anywhere.
You must allocate i before you can use it.
Regards
Re: How to transfer file through serial communication
Don't use "int *i" but "int i". You have an uninitialised pointer. I don't see any reason why would you want to use a pointer to an int, so just use the object directly.
Re: How to transfer file through serial communication
sorry
please refer the post below
Re: How to transfer file through serial communication
rather i've used QString with a little bit modification
Code :
Code:
int size;
int i,j,k;
QFile file("/sfiles/mxdrv.tgz");
if(!file.open( IO_ReadOnly ))
{
QMessageBox::information(0,
"Error",
"Error opening file");
}
else
{
cout<<"File opened successfully"<<endl;
}
cout<<"file opened...."<<endl;
unsigned char fname[]="mxdrv.tgz";
struct termios t;
char *device = "/dev/ttyS0";
int sPort, rbyte, status, sPortdest,length;
long count=0;
unsigned char send1[32];
t.c_cc[VMIN] = 1;
t.c_cc[VTIME]=0;
t.c_cc[VEOF]='\n';
t.c_iflag |= (ISIG);
t.c_iflag &= ~BRKINT;
t.c_cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL;
sPort = open(device,O_RDWR|O_NOCTTY|O_NDELAY);
if(sPort != -1)
{
cout<<"open successfully\n";
status = ioctl(sPort,TCSETS,&t);
cout<<"Entering status"<<status<<endl;
if(status==0)
{
//for(count=0;count<20;count++)
cout<<"sending name"<<endl;
rbyte=write(sPort,fname,strlen((char *)fname));
//usleep(3000);
cout<<"name sent"<<endl;
cout<<"now sending file"<<endl;
while(!file.atEnd())
{
//cout<<"Enter :";
//cin>>send1;
//strcat((char *)send1,"{MSS TYPE-D DAMA}");
// write(sPort,"{012345678}",11);
cout<<"getting byte from file"<<endl;
i=file.getch();
send.sprintf("%d",i);
cout<<send<<endl;
rbyte=write(sPort,send,strlen(send));
cout<<rbyte<<"sent"<<endl;
//cout<<"w b:"<<rbyte<<"\t Time:"<<count<<"\t string:"<<send1<<"\n";
//usleep(1000);
}
}
close(sPort);
}
else
{
cout<<"Device could not be opened";
}
file.close();
when i run the program from the terminal, the bytes get transfered which i can see in the hyperterminal of some other pc.
but then after some time the following comes on the terminal and the program exits abruptly:
*** glibc detected *** ./filetransfer: munmap_chunk(): invalid pointer: 0xbffe8e70 ***
======= Backtrace: =========
/lib/libc.so.6(cfree+0x1bb)[0xe5d67b]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0x6874871]
/usr/lib/qt-3.3/lib/libqt-mt.so.3(_ZN7QWidget5closeEb+0x1f6)[0x5198e6]
./filetransfer[0x804fdcb]
./filetransfer[0x804fa3b]
/usr/lib/qt-3.3/lib/libqt-mt.so.3(_ZN7QObject15activate_signalEP15QConnectio nListP8QUObject+0x16a)[0x4dbe2a]
/usr/lib/qt-3.3/lib/libqt-mt.so.3(_ZN7QObject15activate_signalEi+0xbd)[0x4dc95d]
/usr/lib/qt-3.3/lib/libqt-mt.so.3(_ZN7QButton7clickedEv+0x2c)[0x86f8ac]
/usr/lib/qt-3.3/lib/libqt-mt.so.3(_ZN7QButton17mouseReleaseEventEP11QMouseEv ent+0xbd)[0x57fa3d]
/usr/lib/qt-3.3/lib/libqt-mt.so.3(_ZN7QWidget5eventEP6QEvent+0x3c5)[0x5192d5]
/usr/lib/qt-3.3/lib/libqt-mt.so.3(_ZN12QApplication14internalNotifyEP7QObjec tP6QEvent+0x9b)[0x4730fb]
/usr/lib/qt-3.3/lib/libqt-mt.so.3(_ZN12QApplication6notifyEP7QObjectP6QEvent +0x287)[0x474757]
/usr/lib/qt-3.3/lib/libqt-mt.so.3(_ZN9QETWidget19translateMouseEventEPK7_XEv ent+0x576)[0x40af26]
/usr/lib/qt-3.3/lib/libqt-mt.so.3(_ZN12QApplication15x11ProcessEventEP7_XEve nt+0x5e6)[0x409a26]
/usr/lib/qt-3.3/lib/libqt-mt.so.3(_ZN10QEventLoop13processEventsEj+0x4eb)[0x41b6ab]
/usr/lib/qt-3.3/lib/libqt-mt.so.3(_ZN10QEventLoop9enterLoopEv+0x42)[0x48c672]
/usr/lib/qt-3.3/lib/libqt-mt.so.3(_ZN10QEventLoop4execEv+0x26)[0x48c536]
/usr/lib/qt-3.3/lib/libqt-mt.so.3(_ZN12QApplication4execEv+0x1f)[0x472c0f]
./filetransfer(_ZN7QWidget6createEmbb+0xe2f)[0x804ef2f]
/lib/lAborted
any suggestions ??
Re: How to transfer file through serial communication
Well, what button did you pressed?
From the backtrace it seems that you pressed a button.
BTW, do you use threads in your app?
Re: How to transfer file through serial communication
i dont use any threads in the application
and yes i've pressed a button
actually after pressing that button the code is executed coz the code is written in the click event of that button
Re: How to transfer file through serial communication
What does close(sPort)?
Can you post the code for that?