Forums

Problems with UART1 on LPC2132

Started by soren_t_hansen June 20, 2005
--- In lpc2000@lpc2..., Olivier Ghislain <ghislain_oli@y...>
wrote:
> Le Lundi 20 Juin 2005 16:27, Lowry, Jeff a rit:
> I'm using TCport3 with C++Builder6 and i'm able to receive all byte
value from What is TCport3 ???

hamilton


An Engineer's Guide to the LPC2100 Series

> You are using the generic controls for Win32. You are going to need to
> change the DCE control for windows and write your own drivers. Windows

??? generic controls, own drivers ???

> assumes that the serial RXD and TXD will be in ASCII and not in
> binary. To get binary you have to change the ASCII setting to a BINARY
> setting in teh DCE and then create a RAW rxd and txd routine to allow

??? DCE RAW rxd txd routine ???

> you to get the characters. You can probably use an ActiveX control to
> help you do this so you do not have to reinvent the wheel. If you need
> some ideas I can email you a link of some source code that was written
> for a serial DLL that we give away to customers.

Have you ever programmed Win32? The code below is essentially correct,
CreateFile() and ReadFile() are perfectly usable. The only thing missing is
setting up the port itself. Use SetCommState() for that.

For more reference information see:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/
communications_functions.asp

Eric

> --- In lpc2000@lpc2..., "soren_t_hansen" <soren_t_hansen@y...>
> wrote:
> > I use a Win32 comport to receive with. It has the following setup:
> >
> > HANDLE m_hCom = 0;
> > m_hCom = CreateFile(m_sComPort, // pointer to name of the file
> > GENERIC_READ | GENERIC_WRITE,
> > 0,
> > NULL,
> > OPEN_EXISTING,
> > FILE_FLAG_NO_BUFFERING,
> > NULL);
> >
> > I then read the comport with the following call:
> >
> > ReadFile(m_hCom, buffer, length, &iBytesRead, NULL);
> >
> > How can I prevent the PC from stripping the 0s?
> >
> > Sen
> >
> > --- In lpc2000@lpc2..., Peter Jakacki <peterjak@t...> wrote:
> > > Oh, you can transmit a 0 ok, it's just that the PC may strip NULs
> (0's)
> > > from the input stream. It just comes back down to what software
> you are
> > > using to receive. But since I don't know what you are
> using I can't
> > help. :)
> > >
> > > BTW, try transmiting 0's from the PC back to the PC to
> test that end.
> > > Elimination is the 1st part of debugging.
> > >
> > > *Peter*
> > >
> > > soren_t_hansen wrote:
> > >
> > > >Hi everybody
> > > >
> > > >I want to transmit a number og bytes on UART1 and some
> of them are 0.
> > > >When I receive the bytes on the PC, all the 0s are gone,
> resulting in
> > > >an error on that side.
> > > >
> > > >I use the following to transmit the bytes:
> > > >
> > > >while (!(U1LSR & 0x20));
> > > > U1THR = buffer[i];
> > > >
> > > >Isn't possible to transmit a 0?
> > > >
> > > >Best Regards
> > > >Sen
> > > > Yahoo! Groups Links >



Hi Eric,

Yes on many occasions. What you are using is based on C procedure
calls which use the NULL (0x00) character as a string delimiter. So it
can not be saved or collected as a data value.

regards,
Charles

--- In lpc2000@lpc2..., Eric Rullens <gorilla@d...> wrote:
> > You are using the generic controls for Win32. You are going to need to
> > change the DCE control for windows and write your own drivers. Windows
>
> ??? generic controls, own drivers ???
>
> > assumes that the serial RXD and TXD will be in ASCII and not in
> > binary. To get binary you have to change the ASCII setting to a BINARY
> > setting in teh DCE and then create a RAW rxd and txd routine to allow
>
> ??? DCE RAW rxd txd routine ???
>
> > you to get the characters. You can probably use an ActiveX control to
> > help you do this so you do not have to reinvent the wheel. If you need
> > some ideas I can email you a link of some source code that was written
> > for a serial DLL that we give away to customers.
>
> Have you ever programmed Win32? The code below is essentially correct,
> CreateFile() and ReadFile() are perfectly usable. The only thing
missing is
> setting up the port itself. Use SetCommState() for that.
>
> For more reference information see:
>
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/
> communications_functions.asp
>
> Eric
>
> > --- In lpc2000@lpc2..., "soren_t_hansen" <soren_t_hansen@y...>
> > wrote:
> > > I use a Win32 comport to receive with. It has the following setup:
> > >
> > > HANDLE m_hCom = 0;
> > > m_hCom = CreateFile(m_sComPort, // pointer to name of the file
> > > GENERIC_READ | GENERIC_WRITE,
> > > 0,
> > > NULL,
> > > OPEN_EXISTING,
> > > FILE_FLAG_NO_BUFFERING,
> > > NULL);
> > >
> > > I then read the comport with the following call:
> > >
> > > ReadFile(m_hCom, buffer, length, &iBytesRead, NULL);
> > >
> > > How can I prevent the PC from stripping the 0s?
> > >
> > > Sen
> > >
> > > --- In lpc2000@lpc2..., Peter Jakacki <peterjak@t...> wrote:
> > > > Oh, you can transmit a 0 ok, it's just that the PC may strip NULs
> > (0's)
> > > > from the input stream. It just comes back down to what software
> > you are
> > > > using to receive. But since I don't know what you are
> > using I can't
> > > help. :)
> > > >
> > > > BTW, try transmiting 0's from the PC back to the PC to
> > test that end.
> > > > Elimination is the 1st part of debugging.
> > > >
> > > > *Peter*
> > > >
> > > > soren_t_hansen wrote:
> > > >
> > > > >Hi everybody
> > > > >
> > > > >I want to transmit a number og bytes on UART1 and some
> > of them are 0.
> > > > >When I receive the bytes on the PC, all the 0s are gone,
> > resulting in
> > > > >an error on that side.
> > > > >
> > > > >I use the following to transmit the bytes:
> > > > >
> > > > >while (!(U1LSR & 0x20));
> > > > > U1THR = buffer[i];
> > > > >
> > > > >Isn't possible to transmit a 0?
> > > > >
> > > > >Best Regards
> > > > >Sen
> > > > >
> >
> >
> >
> >
> >
> > Yahoo! Groups Links
> >
> >
> >
> >
> >
> >



> Hi Eric,
>
> Yes on many occasions. What you are using is based on C procedure
> calls which use the NULL (0x00) character as a string delimiter. So it
> can not be saved or collected as a data value.

C'mon, just stop the bs please...

The ReadFile() function couldn't care less about that. It will quite happily
write beyond any zeros in your buffer. Even beyond your buffer in fact, if
you specify the length wrong...

Eric

> --- In lpc2000@lpc2..., Eric Rullens <gorilla@d...> wrote:
> > > You are using the generic controls for Win32. You are
> going to need to
> > > change the DCE control for windows and write your own
> drivers. Windows
> >
> > ??? generic controls, own drivers ???
> >
> > > assumes that the serial RXD and TXD will be in ASCII and not in
> > > binary. To get binary you have to change the ASCII
> setting to a BINARY
> > > setting in teh DCE and then create a RAW rxd and txd
> routine to allow
> >
> > ??? DCE RAW rxd txd routine ???
> >
> > > you to get the characters. You can probably use an
> ActiveX control to
> > > help you do this so you do not have to reinvent the
> wheel. If you need
> > > some ideas I can email you a link of some source code
> that was written
> > > for a serial DLL that we give away to customers.
> >
> > Have you ever programmed Win32? The code below is
> essentially correct,
> > CreateFile() and ReadFile() are perfectly usable. The only thing
> missing is
> > setting up the port itself. Use SetCommState() for that.
> >
> > For more reference information see:
> >
> http://msdn.microsoft.com/library/default.asp?url=/library/en-
> us/devio/base/
> > communications_functions.asp
> >
> > Eric
> >
> > > --- In lpc2000@lpc2..., "soren_t_hansen"
> <soren_t_hansen@y...>
> > > wrote:
> > > > I use a Win32 comport to receive with. It has the
> following setup:
> > > >
> > > > HANDLE m_hCom = 0;
> > > > m_hCom = CreateFile(m_sComPort, // pointer to name of the file
> > > > GENERIC_READ | GENERIC_WRITE,
> > > > 0,
> > > > NULL,
> > > > OPEN_EXISTING,
> > > > FILE_FLAG_NO_BUFFERING,
> > > > NULL);
> > > >
> > > > I then read the comport with the following call:
> > > >
> > > > ReadFile(m_hCom, buffer, length, &iBytesRead, NULL);
> > > >
> > > > How can I prevent the PC from stripping the 0s?
> > > >
> > > > Sen
> > > >
> > > > --- In lpc2000@lpc2..., Peter Jakacki
> <peterjak@t...> wrote:
> > > > > Oh, you can transmit a 0 ok, it's just that the PC
> may strip NULs
> > > (0's)
> > > > > from the input stream. It just comes back down to
> what software
> > > you are
> > > > > using to receive. But since I don't know what you are
> > > using I can't
> > > > help. :)
> > > > >
> > > > > BTW, try transmiting 0's from the PC back to the PC to
> > > test that end.
> > > > > Elimination is the 1st part of debugging.
> > > > >
> > > > > *Peter*
> > > > >
> > > > > soren_t_hansen wrote:
> > > > >
> > > > > >Hi everybody
> > > > > >
> > > > > >I want to transmit a number og bytes on UART1 and some
> > > of them are 0.
> > > > > >When I receive the bytes on the PC, all the 0s are gone,
> > > resulting in
> > > > > >an error on that side.
> > > > > >
> > > > > >I use the following to transmit the bytes:
> > > > > >
> > > > > >while (!(U1LSR & 0x20));
> > > > > > U1THR = buffer[i];
> > > > > >
> > > > > >Isn't possible to transmit a 0?
> > > > > >
> > > > > >Best Regards
> > > > > >Sen
> > > > > >
> > >
> > >
> > >
> > >
> > >
> > > Yahoo! Groups Links
> > >
> > >
> > >
> > >
> > >
> > >
> Yahoo! Groups Links >



> Sorry,
> didn't see the other replys before posting.
>
> The Win functions does not care about zero etc....

They can, in fact. See the fNull member in the DCB structure. But this
'feature' generally isn't used.

> Do a quick check with a scope on the TX line (I'll bet the '0' is
> sent ok), but then you have ruled the ARM out....
> Then, do a TX of a '0' from the PC using loopback (and to be safe,
> measure that with a scope too......

Scoping the lines has my preference too. ;-)

Eric

> --- In lpc2000@lpc2..., Carsten Gr <cgroen@m...> wrote:
> > Hi Sen,
> >
> > well, that would be the first UART if that was the case :-)
> > What are you using for reception on the PC end ?
> > And. have you measured the TX line from the ARM to see if the '0'
> is
> > actually sent (or not) ?
> >
> > Regards,
> > Carsten Gr
> > http://www.moonbounce.dk
> >
> >
> > Yahoo! Groups Links >
>



Hes write about the binary - the flag needs to be set in the dcb

If anyone sends me an email I will return a complete win32 source
in c or pascal

Owen Mooney You are using the generic controls for Win32. You are going to need to
change the DCE control for windows and write your own drivers. Windows
assumes that the serial RXD and TXD will be in ASCII and not in
binary. To get binary you have to change the ASCII setting to a BINARY
setting in teh DCE and then create a RAW rxd and txd routine to allow
you to get the characters. You can probably use an ActiveX control to
help you do this so you do not have to reinvent the wheel. If you need
some ideas I can email you a link of some source code that was written
for a serial DLL that we give away to customers.

regards,
Charles --- In lpc2000@lpc2..., "soren_t_hansen" <soren_t_hansen@y...>
wrote:

>> I use a Win32 comport to receive with. It has the following setup:
>>
>> HANDLE m_hCom = 0;
>> m_hCom = CreateFile(m_sComPort, // pointer to name of the file
>> GENERIC_READ | GENERIC_WRITE,
>> 0,
>> NULL,
>> OPEN_EXISTING,
>> FILE_FLAG_NO_BUFFERING,
>> NULL);
>>
>> I then read the comport with the following call:
>>
>> ReadFile(m_hCom, buffer, length, &iBytesRead, NULL);
>>
>> How can I prevent the PC from stripping the 0s?
>>
>> Sen
>>
>> --- In lpc2000@lpc2..., Peter Jakacki <peterjak@t...> wrote: >>> > Oh, you can transmit a 0 ok, it's just that the PC may strip NULs
>>
>>
(0's)

>>> > from the input stream. It just comes back down to what software
>>
>>
you are

>>> > using to receive. But since I don't know what you are using I can't
>>
>>
>> help. :) >>> >
>>> > BTW, try transmiting 0's from the PC back to the PC to test that end.
>>> > Elimination is the 1st part of debugging.
>>> >
>>> > *Peter*
>>> >
>>> > soren_t_hansen wrote:
>>> >
>>
>>
>>>> > >Hi everybody
>>>> > >
>>>> > >I want to transmit a number og bytes on UART1 and some of them are 0.
>>>> > >When I receive the bytes on the PC, all the 0s are gone, resulting in
>>>> > >an error on that side.
>>>> > >
>>>> > >I use the following to transmit the bytes:
>>>> > >
>>>> > >while (!(U1LSR & 0x20));
>>>> > > U1THR = buffer[i];
>>>> > >
>>>> > >Isn't possible to transmit a 0?
>>>> > >
>>>> > >Best Regards
>>>> > >Sen
>>>> > >
>>>
>>>




Hello everybody, and thanks for the many answers.

It turned out that the problem could be solved very easily, by
changing the fNull in the DCB from true to false :o)

Best Regards
Sen

--- In lpc2000@lpc2..., Eric Rullens <gorilla@d...> wrote:
> > Sorry,
> > didn't see the other replys before posting.
> >
> > The Win functions does not care about zero etc....
>
> They can, in fact. See the fNull member in the DCB structure. But this
> 'feature' generally isn't used.
>