HERE IS SOME UNIX CODE!
Sorry it took so long, but I forgot my password, and I closed my email account, so I couldn't get the password. Anyway (if you haven't figured it out, I am jrmbadger, just posting under jrmbadger2).....
here is some unix code .......
Note that the crc function is copied and pasted straight from the lcd software from crystalfontz.
In unix the serial port can be accessed just like a regular file.
To receive input from say a 633, you would just have to do a
read() command. In a more advanced program I am working on, I use a select statement to multiplex my input and output ....
for more info on read() write() and select() you can do a man read, man write, man select at the unix prompt. The termios just sets terminal i/o settings, and the settings I found by tweaking things. In this example I write the command packet one param. at a time... you might be able to write the packet all at once... but I'm not sure if the serial port is fast enough or not. also notice that my CRC is hardcoded here..... to do it dynamically dependant on packet info, you have to do something like
packet.CRC.as_word = get_crc((ubyte*)&packet,data_length+2,0xFFFF);
the data_length+2 = length of data + 2 bytes for the header.
If people want something more advanced, maybe with some reading and writing, I could definitely post some of that as well.
It's actually fairly simple stuff, once you figure out the tips/tricks.
If you have questions/comments, just contact me.
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
typedef unsigned char ubyte;
typedef signed char sbyte;
typedef unsigned short word;
typedef unsigned long dword;
typedef union
{
ubyte
as_bytes[2];
word
as_word;
}WORD_UNION;
typedef struct
{
ubyte
command;
ubyte
data_length;
char
data[16];
WORD_UNION
CRC;
}COMMAND_PACKET;
word get_crc(char *bufptr,word len,word seed);
int main(void)
{
int fd;
COMMAND_PACKET data;
int i = 0;
struct termios termios;
COMMAND_PACKET packet;
packet.command = 7;
packet.data_length = 16;
strncpy(packet.data,"Hello! ",16);
packet.data[15]=' ';
packet.CRC.as_word = 0x19da;
fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_SYNC);
if(fd == -1)
{
printf("\n file didn't open \n");
return -1;
}
fcntl(fd,F_SETFL,0);
if(tcgetattr(fd,&termios)==-1)
{
printf("\n crap \n");
return -1;
}
termios.c_cflag &=~PARENB;
termios.c_cflag &=~CSTOPB;
termios.c_cflag |= CS8;
cfsetospeed(&termios,B19200);
cfsetispeed(&termios,B19200);
if(tcsetattr(fd,TCSANOW,&termios)==-1)
{
printf("\n sleep needed \n");
return -1;
}
usleep(850000);
write(fd,&packet.command,1);
write(fd,&packet.data_length,1);
for(i = 0;i<16;i++)
write(fd,&packet.data
,1);
write(fd,&packet.CRC.as_bytes[0],1);
write(fd,&packet.CRC.as_bytes[1],1);
usleep(850000);
close(fd);
return(0);
}
word get_crc(char *bufptr,word len,word seed)
{
//CRC lookup table to avoid bit-shifting loops.
static const word crcLookupTable[256] =
{0x00000,0x01189,0x02312,0x0329B,0x04624,0x057AD,0x06536,0x074BF,
0x08C48,0x09DC1,0x0AF5A,0x0BED3,0x0CA6C,0x0DBE5,0x0E97E,0x0F8F7,
0x01081,0x00108,0x03393,0x0221A,0x056A5,0x0472C,0x075B7,0x0643E,
0x09CC9,0x08D40,0x0BFDB,0x0AE52,0x0DAED,0x0CB64,0x0F9FF,0x0E876,
0x02102,0x0308B,0x00210,0x01399,0x06726,0x076AF,0x04434,0x055BD,
0x0AD4A,0x0BCC3,0x08E58,0x09FD1,0x0EB6E,0x0FAE7,0x0C87C,0x0D9F5,
0x03183,0x0200A,0x01291,0x00318,0x077A7,0x0662E,0x054B5,0x0453C,
0x0BDCB,0x0AC42,0x09ED9,0x08F50,0x0FBEF,0x0EA66,0x0D8FD,0x0C974,
0x04204,0x0538D,0x06116,0x0709F,0x00420,0x015A9,0x02732,0x036BB,
0x0CE4C,0x0DFC5,0x0ED5E,0x0FCD7,0x08868,0x099E1,0x0AB7A,0x0BAF3,
0x05285,0x0430C,0x07197,0x0601E,0x014A1,0x00528,0x037B3,0x0263A,
0x0DECD,0x0CF44,0x0FDDF,0x0EC56,0x098E9,0x08960,0x0BBFB,0x0AA72,
0x06306,0x0728F,0x04014,0x0519D,0x02522,0x034AB,0x00630,0x017B9,
0x0EF4E,0x0FEC7,0x0CC5C,0x0DDD5,0x0A96A,0x0B8E3,0x08A78,0x09BF1,
0x07387,0x0620E,0x05095,0x0411C,0x035A3,0x0242A,0x016B1,0x00738,
0x0FFCF,0x0EE46,0x0DCDD,0x0CD54,0x0B9EB,0x0A862,0x09AF9,0x08B70,
0x08408,0x09581,0x0A71A,0x0B693,0x0C22C,0x0D3A5,0x0E13E,0x0F0B7,
0x00840,0x019C9,0x02B52,0x03ADB,0x04E64,0x05FED,0x06D76,0x07CFF,
0x09489,0x08500,0x0B79B,0x0A612,0x0D2AD,0x0C324,0x0F1BF,0x0E036,
0x018C1,0x00948,0x03BD3,0x02A5A,0x05EE5,0x04F6C,0x07DF7,0x06C7E,
0x0A50A,0x0B483,0x08618,0x09791,0x0E32E,0x0F2A7,0x0C03C,0x0D1B5,
0x02942,0x038CB,0x00A50,0x01BD9,0x06F66,0x07EEF,0x04C74,0x05DFD,
0x0B58B,0x0A402,0x09699,0x08710,0x0F3AF,0x0E226,0x0D0BD,0x0C134,
0x039C3,0x0284A,0x01AD1,0x00B58,0x07FE7,0x06E6E,0x05CF5,0x04D7C,
0x0C60C,0x0D785,0x0E51E,0x0F497,0x08028,0x091A1,0x0A33A,0x0B2B3,
0x04A44,0x05BCD,0x06956,0x078DF,0x00C60,0x01DE9,0x02F72,0x03EFB,
0x0D68D,0x0C704,0x0F59F,0x0E416,0x090A9,0x08120,0x0B3BB,0x0A232,
0x05AC5,0x04B4C,0x079D7,0x0685E,0x01CE1,0x00D68,0x03FF3,0x02E7A,
0x0E70E,0x0F687,0x0C41C,0x0D595,0x0A12A,0x0B0A3,0x08238,0x093B1,
0x06B46,0x07ACF,0x04854,0x059DD,0x02D62,0x03CEB,0x00E70,0x01FF9,
0x0F78F,0x0E606,0x0D49D,0x0C514,0x0B1AB,0x0A022,0x092B9,0x08330,
0x07BC7,0x06A4E,0x058D5,0x0495C,0x03DE3,0x02C6A,0x01EF1,0x00F78};
//Initial CRC value is 0x0FFFF.
register word
newCrc;
// newCrc=0xFFFF;
newCrc=seed;
//This algorithim is based on the IrDA LAP example.
while(len--)
newCrc = (newCrc >> 8) ^ crcLookupTable[(newCrc ^ *bufptr++) & 0xff];
/*
ubyte
b1,b2,b3,b4;
word
w1,w2,w3,w4;
while(len--)
{
b1=*bufptr++;
w1=newCrc;
w2=w1 ^ b1;
b2=w2 & 0xff;
w3=crcLookupTable[b2];
w4=newCrc >> 8;
newCrc=w4 ^ w3;
}
*/
//Make this crc match the one's complement that is sent in the packet.
return(~newCrc);
}
Hope this helps!