Объявления лучше делать именно в том модуле, где переменные/структуры инициализируются/используются. В остальных модулях их нужно просто
externнить.
Исходники просмотрел "по диагонали". Замечание такое. Пользуйтесь активнее условной компиляцией. Например, если бы вы содержимое хедера gsm.h обрамили так
Код
#ifndef GSM_H
...
...
...
#endif
То было бы проще
externить эту структуру. Достаточно про
includeть gsm.h непосредственно уже в исходник.
К тому же я обычно пользуюсь
typedefом, в т.ч. для того, чтобы было удобнее объявлять и
externить структуры.
Ведь проще один раз написать
Код
#ifndef GSM_H
typedef struct st_GSM_Rx {
unsigned char Buf[80];
unsigned char Start;
unsigned char End;
unsigned char Tout;
} st_GSM_Rx;
#endif
А потом про
includeть этот хедер и знай объявляй себе эти структуры
Код
st_GSM_Rx GSM_Rx;
и/или
Код
extern st_GSM_Rx GSM_Rx;
P.S. гы

пока я писал ответ, zltigo уже пример с конкретными изменениями предложил.